簡體   English   中英

如何在散點圖中繪制超過50,000個值,從而節省計算機資源?

[英]How can I plot more than 50,000 values in a scatter chart, saving computer resource?

我正在使用Visual Studio 2017,正在嘗試制作一個使用C#和Winform在散點圖中顯示實時值的程序。

在下面的源代碼中,無論何時發生事件並獲得新值(每秒3〜5次),我都可以使它顯示實時值。

valueArray通過GetRealTimeData函數連續獲取新值,該圖顯示了數組中的所有元素。

        valueArray[valueArray.Length - 1] = Convert.ToDouble(GetRealTimeData().Trim());

        Array.Copy(valueArray, 1, valueArray, 0, valueArray.Length - 1);

        this.chart1.Series["Series1"].Points.Clear();
        this.chart1.Series["Series1"].Points.DataBindY(valueArray);

但是,我在使用此程序時遇到問題,即使在圖表中顯示3,000個值,它也會消耗大量計算機資源。

我計划使圖表代表50,000至100,000個值,但我認為它會占用過多的資源,並且每次獲取新值時都會顯示舊值。

我想知道是否有任何函數或方法來完成這種工作。 如果能得到一些建議或想法,我將不勝感激。

我幾乎沒有理由知道要向任何圖表加載100,000+點。 您可以使用原始點的一小部分來顯示數據,而不會丟失任何可視信息 以下示例過濾掉100,000點到250點(0.25%):

在此處輸入圖片說明

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        double percent = 0.0025;

        List<DataPoint> original = GetData();
        List<DataPoint> filtered = Filter(original, percent);

        foreach (DataPoint dp in original)
            chart1.Series[0].Points.Add(dp);

        foreach (DataPoint dp in filtered)
            chart1.Series[1].Points.Add(dp);

        chart1.ChartAreas[0].AxisY.Maximum = original.Max(dp => dp.YValues[0]);
        chart1.ChartAreas[0].AxisY.Minimum = original.Min(dp => dp.YValues[0]);
        chart1.ChartAreas[0].AxisX.Minimum = 0;

        Text = string.Format("original = {0:0,0} points, filtered = {1:0,0} points, percent = {2:P2}", original.Count, filtered.Count, percent);
    }

    private List<DataPoint> Filter(List<DataPoint> orig, double percent)
    {
        Random r = new Random(DateTime.Now.Millisecond);

        List<DataPoint> filt = new List<DataPoint>(orig.ToArray());
        double total = filt.Count;

        while (filt.Count / total > percent)
            filt.RemoveAt(r.Next(1, filt.Count - 1));

        return filt;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (chart1.Series[0].Enabled)
        {
            chart1.Series[0].Enabled = false;
            chart1.Series[1].Enabled = true;
        }
        else
        {
            chart1.Series[0].Enabled = true;
            chart1.Series[1].Enabled = false;
        }
    }
}

我了解您正在動態添加點,因此您必須為其添加一些邏輯。 但是我的觀點仍然是:您必須過濾數據。 此外,如果可以提出一個,可以使用更復雜的過濾器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM