首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用或扩展FSharpChart库来创建滑动窗口的线图?

是否可以使用或扩展FSharpChart库来创建滑动窗口的线图?
EN

Stack Overflow用户
提问于 2014-10-20 18:22:02
回答 1查看 213关注 0票数 1

我一直在试图找出如何使用F#库创建一个图表,该库显示了一个滑动的数据窗口。例如,我希望能够显示过去3分钟的所有值。比这更早的值会从图表上掉下来,并随着新值的观察而被替换。

根据我的实验,我认为底层的Microsoft图表控件不支持这种情况。有人知道是否有可能创建这种类型的图表吗?还有其他有这种能力的替代品吗?

这是我试过的“实验”。更新本系列中的值的任务将产生异常。

System.InvalidOperationException:集合已被修改;枚举操作可能不会执行。

代码语言:javascript
复制
#r "System.Windows.Forms.DataVisualization.dll"

open System.Drawing
open System.Collections.ObjectModel
open System.Windows.Forms
open System.Windows.Forms.DataVisualization.Charting

/// Add data series of the specified chart type to a chart
let addSeries typ (chart:Chart) =
    let series = new Series(ChartType = typ)
    chart.Series.Add(series)
    series

/// Create form with chart and add the first chart series
let createChart typ =
    let chart = new Chart(Dock = DockStyle.Fill, 
                          Palette = ChartColorPalette.Pastel)
    let mainForm = new Form(Visible = true, Width = 700, Height = 500)
    let area = new ChartArea()
    area.AxisX.MajorGrid.LineColor <- Color.LightGray
    area.AxisY.MajorGrid.LineColor <- Color.LightGray
    mainForm.Controls.Add(chart)
    chart.ChartAreas.Add(area)
    chart, addSeries typ chart

let numbers = 
    seq { while true do for i in 0.0 .. 0.1 .. 45.0 do yield i }
    |> Seq.map sin

let dataWindow = new ObservableCollection<double>()

numbers
|> Seq.take 100
|> Seq.iter dataWindow.Add

let chart, series = createChart SeriesChartType.Line
series.BorderWidth <- 3
series.Points.DataBindY(dataWindow)

async{
    for number in numbers do
        series.Points.RemoveAt(0)
        series.Points.Add(number) |> ignore
}
|> Async.Start
EN

回答 1

Stack Overflow用户

发布于 2014-10-21 18:39:59

通过避免DataBindY调用,并显式地添加和移除点,我能够完成类似的工作。

代码语言:javascript
复制
#r "System.Windows.Forms.DataVisualization.dll"

open System
open System.Drawing
open System.Threading
open System.Windows.Forms
open System.Windows.Forms.DataVisualization.Charting

/// Add data series of the specified chart type to a chart
let createSeries typ (chart:Chart) =
    let series = new Series(ChartType = typ)
    chart.Series.Add(series)    
    series

/// Create form with chart and add the first chart series
let createChart() =
    let chart = new Chart(Dock = DockStyle.Fill, 
                          Palette = ChartColorPalette.Pastel)
    let mainForm = new Form(Visible = true, Width = 700, Height = 500)
    let area = new ChartArea()
    area.AxisX.MajorGrid.LineColor <- Color.LightGray
    area.AxisY.MajorGrid.LineColor <- Color.LightGray
    mainForm.Controls.Add(chart)
    chart.ChartAreas.Add(area)
    chart

let numbers = 
    seq { while true do for i in 0.0 .. 0.1 .. Double.MaxValue do yield i }
    |> Seq.map sin

let chart = createChart()
let series = createSeries SeriesChartType.FastLine chart

let firstWindow = numbers |> Seq.take 100

for number in firstWindow do
    series.Points.AddY(number) |> ignore

let context = SynchronizationContext.Current
let numbersEnumerator = numbers.GetEnumerator()
async{
    do! Async.SwitchToContext context
    while(numbersEnumerator.MoveNext() && not chart.IsDisposed) do        
        let number = numbersEnumerator.Current
        series.Points.SuspendUpdates()
        series.Points.RemoveAt(0)
        series.Points.AddY( number ) |> ignore
        series.Points.ResumeUpdates()
        do! Async.SwitchToThreadPool()
        do! Async.Sleep(100)
        do! Async.SwitchToContext context
}
|> Async.Start
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26472339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档