我一直在试图找出如何使用F#库创建一个图表,该库显示了一个滑动的数据窗口。例如,我希望能够显示过去3分钟的所有值。比这更早的值会从图表上掉下来,并随着新值的观察而被替换。
根据我的实验,我认为底层的Microsoft图表控件不支持这种情况。有人知道是否有可能创建这种类型的图表吗?还有其他有这种能力的替代品吗?
这是我试过的“实验”。更新本系列中的值的任务将产生异常。
System.InvalidOperationException:集合已被修改;枚举操作可能不会执行。
#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发布于 2014-10-21 18:39:59
通过避免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.Starthttps://stackoverflow.com/questions/26472339
复制相似问题