【问题标题】:F# Charting LiveChart implementation ObservableF# Charting LiveChart 实现 Observable
【发布时间】:2015-06-08 13:35:20
【问题描述】:

我正在尝试从 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> 到底是什么?!为什么这个函数的参数是一个巨大的元组?

【问题讨论】:

标签: types charts f# signature observable


【解决方案1】:

您需要一个 Observable,它发出一系列 DateTime * float 值而不是单个数据点(我想,不能用单个点来制作很多折线图)。

如果您只有一个 Observable 一次发出一个数据点,我想您想要做的是拥有另一个 Observable,它将在单个序列中累积一系列观察结果,并将其用作数据源为您的图表。

该函数的参数是一个“元组”,因为这样可以使用可选参数(否则跳过它们)。使用静态成员以从可选参数或重载等内容中受益是一种常见模式,常规的 let 绑定 F# 函数不支持这些内容。

【讨论】:

    【解决方案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 
    

    也许此代码将有助于解决您的问题。工作几分钟后:

    如果我作为一个新手犯了严重的错误,我希望有经验的网站成员能纠正我。如果我给了不好的建议,我提前道歉

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-06
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2017-09-20
      • 1970-01-01
      相关资源
      最近更新 更多