我试图从FSharp Charting实施实时图表。文档here为实时折线图提供了类型签名:
static member LiveChart.Line : data:IObservable<#seq<'a1 * 'a2>> * ?Name:string * ?Title:string * ?Color:Color * ?XTitle:string * ?YTitle:string -> GenericChart (requires 'a1 :> key and 'a2 :> value)
我有一个IObservable,它发出时间序列的数据,包含时间和值,但世界上有什么是IObservable&lt; #seq&lt;&#39; a1 *&#39; a2&gt;&gt;?!为什么这个函数的论证是一个巨大的元组?
答案 0 :(得分:2)
你需要一个Observable,它发出一系列DateTime * float
值,而不是一个数据点(我猜想,不能在一个点上创建很多折线图)。
如果你只有一个Observable一次只发出一个数据点,我想你想要做的是让另一个Observable在一个序列中累积一系列观察,并将其用作数据源为您的图表。
该函数的参数是&#34; tuple&#34;,因为它允许使用可选参数(否则跳过它们)。这是使用静态成员以便从可选参数或重载等内容中受益的常见模式,常规的自由绑定F#函数不支持这种模式。
答案 1 :(得分:2)
早些时候Observable和Live Chart不起作用,但我写了一个简单的例子:
open System
open System.Windows.Forms
open System.Reactive.Linq
open FSharp.Charting
[<EntryPoint>]
[<STAThread>]
let main argv =
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault false
let form = new Form(Visible = true, TopMost = true,
Width = 700, Height = 500)
let rand = new Random()
let obs = Observable.Interval(TimeSpan.FromSeconds(1.0)).
ObserveOn(WindowsFormsSynchronizationContext.Current)
|> Observable.map(fun _ -> DateTime.Now.ToShortTimeString(),rand.Next(0,21))
let one = LiveChart.FastLineIncremental(obs,Name="Simple Example")
one.ShowChart()
Application.Run form
0
也许此代码有助于解决您的问题。几分钟后工作:
如果我作为新手犯了严重的错误,我希望网站上更有经验的成员会纠正我。如果我给出了不好的建议,我会提前道歉