Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Charts 是否可以使用或扩展FSharpChart库来创建滑动窗口的折线图?_Charts_F# - Fatal编程技术网

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

Charts 是否可以使用或扩展FSharpChart库来创建滑动窗口的折线图?,charts,f#,Charts,F#,我一直在试图找出如何使用FSharpCharting库在F#中创建图表,它显示了一个滑动的数据窗口。例如,我希望能够显示过去3分钟的所有值。超过该值的值将从图表中消失,并在观察到新值时被替换 根据我的实验,我认为底层的Microsoft图表控件不支持这种情况。有人知道是否可以创建这种类型的图表吗?是否有其他具有此功能的替代方案 这是我尝试过的“实验”。更新序列中的值的任务会产生异常 System.InvalidOperationException:集合已修改;枚举操作不能执行 #r“System

我一直在试图找出如何使用FSharpCharting库在F#中创建图表,它显示了一个滑动的数据窗口。例如,我希望能够显示过去3分钟的所有值。超过该值的值将从图表中消失,并在观察到新值时被替换

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

这是我尝试过的“实验”。更新序列中的值的任务会产生异常

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

#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