Построение рамки 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", который включает эти перегрузки (см. Здесь)

Другие вопросы по тегам