Построение рамки Deedle
У меня есть следующий кусок кода:
let mychart = frame.GetAllSeries() |> Seq.iter(fun key value -> Chart.Line(value, Name=key) |> Chart.Combine
где frame.GetAllSeries()
возвращает seq<KeyValuePair>
, Я хотел бы передать последовательность прямо на графике. Я думал, что мог бы перебрать последовательность. Проблема в том, что я не могу найти идиоматический способ доступа к ключу и значению отдельно, который мог бы быть подключен непосредственно в лямбда-выражении.
Благодарю.
РЕДАКТИРОВАТЬ
Это работает:
let chart = frame.GetAllSeries() |> Seq.map( fun (KeyValue(k,v)) -> Chart.Line(v |> Series.observations, Name=k)) |> Chart.Combine
.. это может быть проще? У меня большой набор данных, и я боюсь, что на производительность повлияет столько преобразований.
1 ответ
Как вы уже выяснили, используя Series.observations
дает вам последовательность пар ключ-значение из серии, которую вы затем можете передать Chart.Line
и т.п.
Это определенно то, что не нужно, и вы можете упростить код, используя метод расширения, который позволяет автоматически строить серии:
[<AutoOpen>]
module FsLabExtensions =
type FSharp.Charting.Chart with
static member Line(data:Series<'K, 'V>, ?Name, ?Title, ?Labels, ?Color, ?XTitle, ?YTitle) =
Chart.Line(Series.observations data, ?Name=Name, ?Title=Title, ?Labels=Labels, ?Color=Color, ?XTitle=XTitle, ?YTitle=YTitle)
Если вы включите это, вы можете построить серию напрямую:
let s = series [ for x in 0.0 .. 0.1 .. 1.0 -> x, sin x ]
Chart.Line(s)
Вы также можете сослаться на диаграмму Deedle & F# через наш экспериментальный пакет "FsLab", который включает эти перегрузки (см. Здесь)