Charts 是否可以使用或扩展FSharpChart库来创建滑动窗口的折线图?
我一直在试图找出如何使用FSharpCharting库在F#中创建图表,它显示了一个滑动的数据窗口。例如,我希望能够显示过去3分钟的所有值。超过该值的值将从图表中消失,并在观察到新值时被替换 根据我的实验,我认为底层的Microsoft图表控件不支持这种情况。有人知道是否可以创建这种类型的图表吗?是否有其他具有此功能的替代方案 这是我尝试过的“实验”。更新序列中的值的任务会产生异常 System.InvalidOperationException:集合已修改;枚举操作不能执行Charts 是否可以使用或扩展FSharpChart库来创建滑动窗口的折线图?,charts,f#,Charts,F#,我一直在试图找出如何使用FSharpCharting库在F#中创建图表,它显示了一个滑动的数据窗口。例如,我希望能够显示过去3分钟的所有值。超过该值的值将从图表中消失,并在观察到新值时被替换 根据我的实验,我认为底层的Microsoft图表控件不支持这种情况。有人知道是否可以创建这种类型的图表吗?是否有其他具有此功能的替代方案 这是我尝试过的“实验”。更新序列中的值的任务会产生异常 System.InvalidOperationException:集合已修改;枚举操作不能执行 #r“System
#r“System.Windows.Forms.DataVisualization.dll”
开放系统.绘图
open System.Collections.ObjectModel
打开System.Windows.Forms
open System.Windows.Forms.DataVisualization.Charting
///将指定图表类型的数据系列添加到图表
let add系列类型(图表:图表)=
let系列=新系列(图表类型=典型)
图表.系列.添加(系列)
系列
///使用图表创建表单并添加第一个图表系列
让createChart类型=
让图表=新图表(Dock=DockStyle.Fill,
调色板=ChartColorPalette.Pastel)
让mainForm=newform(可见=true,宽度=700,高度=500)
let area=新图表区域()
area.AxisX.MajorGrid.LineColor Seq.take 100
|>Seq.iter数据窗口。添加
let chart,series=createChart serieChartType.Line
series.BorderWidth忽略
}
|>异步启动
通过避免DataBindY调用,并显式地添加和删除点,我能够实现类似的功能
#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
#r“System.Windows.Forms.DataVisualization.dll”
开放系统
开放系统.绘图
开放系统。线程
打开System.Windows.Forms
open System.Windows.Forms.DataVisualization.Charting
///将指定图表类型的数据系列添加到图表
让createSeries类型(图表:图表)=
let系列=新系列(图表类型=典型)
图表.系列.添加(系列)
系列
///使用图表创建表单并添加第一个图表系列
让我们创建图表()=
让图表=新图表(Dock=DockStyle.Fill,
调色板=ChartColorPalette.Pastel)
让mainForm=newform(可见=true,宽度=700,高度=500)
let area=新图表区域()
area.AxisX.MajorGrid.LineColor Seq.take 100
对于firstWindow中的数字,请执行以下操作:
series.Points.AddY(number)|>忽略
let context=SynchronizationContext.Current
让numbersEnumerator=numbers.GetEnumerator()
异步的{
do!Async.SwitchToContext上下文
而(numbersEnumerator.MoveNext()&¬ chart.IsDisposed)do
设number=numbersEnumerator.Current
series.Points.SuspendUpdates()
系列点移除(0)
series.Points.AddY(number)|>忽略
series.Points.ResumeUpdates()
do!Async.SwitchToThreadPool()
do!Async.Sleep(100)
do!Async.SwitchToContext上下文
}
|>异步启动
您在FSharp.Charting网站上看过实时图表示例吗?他们可能会有所帮助。谢谢我可能能够调整第一个图表,使其与我想要的序列上的某种窗口一起工作。
#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