如何在散点图中绘制超过 50,000 个值,从而节省计算机资源?

2023-12-11

我正在使用 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%) 的示例:

enter image description here

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;
        }
    }
}

我知道您正在动态添加点,因此您必须为其添加一些逻辑。但我的观点仍然成立:你must过滤您的数据。此外,如果您能找到一个更复杂的过滤器,您也可以使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在散点图中绘制超过 50,000 个值,从而节省计算机资源? 的相关文章

随机推荐

  • Apache Flink:如何在摄取时间模式下获取事件的时间戳?

    我想知道是否可以使用Flink的摄取时间模式来获取记录的时间戳 考虑以下 flink 代码示例 https github com apache flink blob master flink examples flink examples
  • 在启用安全管理命令后,Glassfish 5 将无法启动

    输入enable secure admin 命令后 我无法运行 Glassfish 5 我有明确的操作系统 Ubutntu 服务器 16 04 然后我安装 java 8 并下载 zip 文件中的 glassfish 服务器 可能是什么问题呢
  • 如何使用 Graph-API 在 Facebook 中搜索特定位置的所有用户

    我有一个项目 我必须在 Facebook 上搜索所有人 特定位置 然后对数据应用进一步的过滤器 我的问题和问题是 如何使用 Graph API 获取初始数据 我知道这是可能的 使用 Facebook 本身的搜索字段 只需输入 所有居住在 的
  • 如何使用表面视图在用户不知情的情况下捕获图像?

    我想从 Android 相机捕获图像 但用户不知情 public class Capture extends Activity public Uri fileUri public String filepath1 public static
  • doGet 方法完成后 Servlet 是否返回响应?

    显然 doGet方法的返回类型为 void 因此 它不返回任何内容 从这个意义上说 我使用 返回 一词来表示将响应发送回请求它的客户端 我正在尝试实现一个长轮询 Servlet 在我有想要发回的内容之前不发送响应是有益的 因此 在 doGe
  • 我怎样才能让它在 android/iphone 上播放视频?

    update 1 我不太了解 但我想做的是通过 html5 在 android 手机上播放视频 正如其他人所说 我必须使用标签才能做到这一点 结束更新1 updated 这是我的 html 页面上的代码
  • 如何获取我的程序中单击的每个按钮的索引?

    所以我有一个双按钮数组 单击按钮后 我需要能够获取它的索引以用于进一步编码 这是一个类似扫雷的游戏 这是我到目前为止的代码 我有一个双 for 循环来为每个按钮创建一个 Handle 事件 但我不知道如何获取每个按钮的索引 我尝试过 e g
  • UINavigationBar 与 UISegmentedControl 部分覆盖 childViews

    我已经阅读了有关此内容和 Apple 文档的许多其他主题 但尚未找到针对我的特定问题的解决方案 我的应用程序使用UITabBarController as the rootViewController 在其中一个选项卡中我有一个UISegm
  • 迭代器内的元素发生变化

    我想迭代作为成员包含在名为的结构中的向量内的一些元素Test 想法是要变异的Test在每次迭代中都是独立的 如果每次迭代中的某些外部逻辑发生变化 则表示成功Test是成功的 为简单起见 突变只是将向量元素更改为123u8 我遇到的问题是无法
  • 虚拟化 WrapPanel

    WPF 4 是否还包含虚拟化 WrapPanel 或者是否可以轻松地从现有面板派生一个虚拟化 WrapPanel 我想做一个像 Outlook 那样的地址视图 我认为不可能实现具有完全虚拟化的 WrapPanel 在两个方向上 但请检查一下
  • PowerShell - 脚本 1 调用脚本 2 - 如何将值从脚本 2 返回到脚本 1

    我有两个 PowerShell 脚本 一个脚本使用提升的凭据调用另一个 PowerShell 脚本 使用启动进程 但我正在努力解决如何使第二个脚本将输出值返回到第一个脚本 这是脚本 1 使用 script1 psl sender ip 10
  • 去除JS数据结构中的一层嵌套数组

    如何转换以下数据结构 var data time 1 speed 20 to var data time 1 speed 54 我只想删除数组 由于数据是一个数组 您只需选择外部数组的第一个元素 所以解决方案是 var data time
  • 按下或禁用时不要更改 NSButton 的外观

    我有两个 NSButton 其中包含打开状态和关闭状态的图像 一次只能有一个人处于活动状态 单击一个 然后单击另一个以来回更改属性 问题是 如果我在单击按钮时禁用它 以便无法再次单击它 则禁用按钮时图像会变暗 而且我不希望它变暗 我只想使用
  • 如何引用 Lambda?

    我怎样才能推荐Lambda从它的内部 例如 如果我需要使用myLambda递归地 myLambda gt expression how can I refer to myLambda here 如果您的意思是要引用您正在定义的 lambda
  • 如何验证 MM/dd/yyyy hh:mm 格式的日期时间?

    我正在使用 MaskedEditExtender 输入日期时间 我无法弄清楚如何验证它 是否有任何正则表达式用于验证日期和时间 MM dd yyyy hh mm 或任何 JavaScript 函数 这将解决您的问题 0 1 9 1 0 2
  • 如何使用 php 在后台(非阻塞)运行程序?

    我想在php中运行一个shell脚本 但是这个shell脚本需要很长时间才能执行 它有睡眠 我不希望Web服务器在执行这个脚本时阻塞 我试过exec and shell exec 在 php 中 但服务器停止直到 shell 脚本完成 我想
  • Spring Data MongoDB - 忽略空对象

    我使用 Spring Data 和 MongoDB 来保存一些文档 保存文档时 我希望 Mongo 不包含空对象 如何 可以实现这一目标 假设我有以下主类 Document collection main doc public class
  • 如何访问从模板化控件继承的控件中的命名元素

    你好 这类似于如何在 silverlight 中访问派生用户控件的命名元素 不同之处在于继承自模板化控件 而不是用户控件 我有一个名为 MyBaseControl 的模板化控件 Xaml
  • data.table 警告 - 项目已达到尺寸,但最大尺寸为(回收后留下剩余项目)

    我正在使用 data table J 来做子集th1在 5 列上 split1 market dept size bool 3 cust poor rich 我明白我应该使用unique column name 指定该列应包含任何值 尽管我
  • 如何在散点图中绘制超过 50,000 个值,从而节省计算机资源?

    我正在使用 Visual Studio 2017 并尝试使用 C 和 winform 制作一个在散点图中显示实时值的程序 通过下面的源代码 我能够让它显示实时值 每当事件发生并且它获得新值 每秒 3 5 次 valueArray 通过 Ge