数据图表ScottPlot.WPF用法示例

news2025/3/4 2:05:11

目录

 一、添加 NuGet 程序包(5.0.47)

二、MainWindow.xaml中添加引用 

三、MainWindow.xaml.cs 具体使用代码 


图表示例:

 一、添加 NuGet 程序包(5.0.47)

二、MainWindow.xaml中添加引用 

<Window x:Class="jssc_analysis2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        xmlns:ScottPlot="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF"
        Title="数据分析" Width="1280" MinWidth="1280"  Height="725" MinHeight="725" Topmost="False" Background="Gray" WindowStartupLocation="CenterScreen">

    <Grid x:Name="control_grid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <ScottPlot:WpfPlot x:Name="wpfPlot" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </Grid>
</Window>

三、MainWindow.xaml.cs 具体使用代码 

private List<DateTime> timeData;
private List<double> priceData;
private Scatter scatterPlot;
private Crosshair crosshair;
private Annotation highlightAnnotation;	//文本提示框

private async void Btn_startOnClick(object sender, RoutedEventArgs e)
{
	timeData = new List<DateTime>();
    priceData = new List<double>();

    for (int i = 0; i < pointCount; i++)
    {
        timeData.Add(startTime.AddMinutes(i * 5)); // 每 5 分钟一个点
        priceData.Add(Math.Sin(i * 0.1) * 100 + rand.Next(-5, 5)); // 模拟盈亏金额走势
    }
	
    // 转换时间为 double(OADate 格式)
    double[] xs = timeData.ConvertAll(t => t.ToOADate()).ToArray();
    double[] ys = priceData.ToArray();
    // 添加曲线
    scatterPlot = wpfPlot.Plot.Add.Scatter(xs, ys, ScottPlot.Colors.Red);
    scatterPlot.LineWidth = 2;
    scatterPlot.MarkerSize = 4;
    scatterPlot.MarkerShape = MarkerShape.FilledCircle;

    crosshair = wpfPlot.Plot.Add.Crosshair(0, 0);
    crosshair.IsVisible = false;
    crosshair.MarkerShape = MarkerShape.FilledCircle;
    crosshair.MarkerSize = 15;

    // 添加鼠标悬停的文本提示 (Annotation)
    highlightAnnotation = wpfPlot.Plot.Add.Annotation("");
    highlightAnnotation.LabelOffsetX = 0;
    highlightAnnotation.LabelOffsetY = 0;
    highlightAnnotation.LabelBackgroundColor = ScottPlot.Colors.LightYellow;
    highlightAnnotation.LabelBorderColor = ScottPlot.Colors.Black;
    highlightAnnotation.LabelFontSize = 15;
    highlightAnnotation.IsVisible = false; // 初始时不显示

    // 配置 X 轴显示时间格式
    wpfPlot.Plot.Axes.DateTimeTicksBottom();
    wpfPlot.Refresh();
    // 绑定鼠标移动事件
    wpfPlot.MouseMove += WpfPlot_MouseMove;
}

private void WpfPlot_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
    // 获取鼠标位置(需转换为图表像素坐标)
    Pixel mousePixel = new Pixel(
        x: (int)e.GetPosition(wpfPlot).X,
        y: (int)e.GetPosition(wpfPlot).Y
    );

    Coordinates mouseLocation = wpfPlot.Plot.GetCoordinates(mousePixel);
    DataPoint nearest = scatterPlot.Data.GetNearest(mouseLocation, wpfPlot.Plot.LastRender);

    // 将十字线置于突出显示的点上
    if (nearest.IsReal)
    {
        crosshair.IsVisible = true;
        crosshair.Position = nearest.Coordinates;
        highlightAnnotation.Text = $"Index:{nearest.Index}\r\nNumber:{nearest.Y:0.##}\r\nTime:{DateTime.FromOADate(nearest.X)}";
        highlightAnnotation.IsVisible = true;
    }

    // 当未选择任何点时隐藏十字准线
    if (!nearest.IsReal && crosshair.IsVisible)
    {
        crosshair.IsVisible = false;
        highlightAnnotation.Text = $"";
        highlightAnnotation.IsVisible = false;
    }

    wpfPlot.Refresh(); // 刷新图表
}

另:Annotation暂时无法支持中文,有解决办法的话欢迎留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第二十五周】:DeepPose:通过深度神经网络实现人体姿态估计

DeepPose 摘要Abstract文章信息引言DeepPose归一化网络结构初始网络&#xff08;粗略估计所有关节点位置&#xff09;精细化级联网络&#xff08;分别修正每个关节点的位置&#xff09; 疑问与解决代码实践总结 摘要 这篇博客介绍了DeepPose&#xff0c;这是首个基于深度神经网…

ARM Linux LCD上实时预览摄像头画面

文章目录 1、前言2、环境介绍3、步骤4、应用程序编写4.1、lcd初始化4.2、摄像头初始化4.3、jpeg解码4.4、开启摄像头4.5、完整的程序如下 5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 本次应用程序主要针对支持MJPEG格式输出的UVC摄像头。 2、环境介绍 rk35…

MacOS本地部署Deepseek,不联网也可以使用AI,保护隐私

苹果笔记本本地部署deepseek主要用到Ollama与open-webui 1. 安装Ollama “Ollama” 是一个轻量级的 AI 模型运行时环境&#xff08;runtime&#xff09;&#xff0c;旨在简化在本地部署和使用大语言模型&#xff08;LLM&#xff09;的过程。它由 Vicarious 公司开发&#xff…

Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接

官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…

创建一个MCP服务器,并在Cline中使用,增强自定义功能。

MCP介绍 MCP 是一个开放协议&#xff0c;它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样&#xff0c;MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…

游戏引擎学习第131天

仓库:https://gitee.com/mrxiao_com/2d_game_3 运行游戏并识别我们的小问题 今天的工作重点是对游戏引擎进行架构优化&#xff0c;特别是针对渲染和多线程的部分。目前&#xff0c;我们的目标是让地面块在独立线程上进行渲染&#xff0c;以提高性能。在此过程中&#xff0c;我…

人大金仓国产数据库与PostgreSQL

一、简介 在前面项目中&#xff0c;我们使用若依前后端分离整合人大金仓&#xff0c;在后续开发过程中&#xff0c;我们经常因为各种”不适配“问题&#xff0c;但可以感觉得到大部分问题&#xff0c;将人大金仓视为postgreSQL就能去解决大部分问题。据了解&#xff0c;Kingba…

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…

APISIX Dashboard上的配置操作

文章目录 登录配置路由配置消费者创建后端服务项目配置上游再创建一个路由测试 登录 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根据docker 容器里的指定端口&#xff1a; 配置路由 通过apisix 的API管理接口来创建&#xff08;此路由&#xff0c;直接…

计算机毕业设计SpringBoot+Vue.js人力资源管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

腾讯云扩容记录

腾讯云扩容&#xff1a; sudo yum install -y cloud-utils-growpart 安装扩容工具 sudo file -s /dev/vda1 有数据 sudo LC_ALLen_US.UTF-8 growpart /dev/vda 1 sudo resize2fs /dev/vda1 df -Th 完毕 以下是对执行的命令的详细解释以及背后的原理&#xff1a; 1. 安装 cloud…

Cherry Studio + 火山引擎 构建个人AI智能知识库

&#x1f349;在信息化时代&#xff0c;个人知识库的构建对于提高工作效率、知识管理和信息提取尤为重要。尤其是当这些知识库能结合人工智能来智能化地整理、分类和管理数据时&#xff0c;效果更为显著。我最近尝试通过 Cherry Studio 和 火山引擎 来搭建个人智能知识库&#…

完美解锁便捷版!

视频文件的种类繁多&#xff0c;包括常见的格式如MP4、AVI、MOV、MKV等。随着视频技术的发展&#xff0c;新的编码格式如HEVC&#xff08;H.265&#xff09;和AV1也逐渐被广泛应用&#xff1b;视频文件通常会经过压缩&#xff0c;并且每种格式都有其独特的编码方式和特性&#…

JAVA SE 包装类和泛型

文章目录 &#x1f4d5;1. 包装类✏️1.1 基本数据类型和对应的包装类✏️1.2 装箱和拆箱✏️1.3 自动装箱和自动拆箱 &#x1f4d5;2. 泛型✏️2.1 泛型的语法✏️2.2 泛型类的使用✏️2.3 裸类型(Raw Type)✏️2.4 擦除机制✏️2.5 泛型的上界✏️2.6 泛型方法✏️2.7 通配符…

人工智能AI在汽车设计领域的应用探索

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

Vue3国际化开发实战:i18n-Ally + vue-i18n@next高效配置教程,项目中文显示

本文详解 Vue3 国际化开发全流程&#xff1a;从安装 vue-i18nnext 到配置多语言文件&#xff08;JSON/YAML&#xff09;&#xff0c;结合 i18n-Ally 插件实现高效翻译管理。重点涵盖&#xff1a; 工程配置&#xff1a;创建 i18n 实例、模块化语言文件结构&#xff08;支持命名…

深入理解Spring @Async:异步编程的利器与实战指南

一、为什么需要异步编程&#xff1f; 在现代高并发系统中&#xff0c;同步阻塞式编程会带来两大核心问题&#xff1a; // 同步处理示例 public void processOrder(Order order) {// 1. 保存订单&#xff08;耗时50ms&#xff09;orderRepository.save(order); // 2. 发送短信…

java后端开发day25--阶段项目(二)

&#xff08;以下内容全部来自上述课程&#xff09; 1.美化界面 private void initImage() {//路径分两种&#xff1a;//1.绝对路径&#xff1a;从盘符开始写的路径 D:\\aaa\\bbb\\ccc.jpg//2.相对路径&#xff1a;从当前项目开始写的路径 aaa\\bbb\\ccc.jpg//添加图片的时…

【 开发知识点 一 】 随机数生成器 /dev/urandom 和 /dev/random

文章目录 一、随机数生成器 是什么 ?二、为什么 需要 随机数生成器 ?三、随机数生成器 基本原理四、随机数生成器 三个输出接口五、随机生成器 应用1、简单应用2、项目应用一、随机数生成器 是什么 ? /dev/random 和 /dev/urandom 是 Linux 上的字符设备文件,它们是随机数…

(动态规划 最长递增的子序列)leetcode 300

这道题我第一眼反应就是暴力&#xff0c;但是暴力的话就是n*n-1*n-2*...n-(n-1) 也就是O(n^n)dfs做绝对超时 贪心也不行&#xff0c;这里是子序列&#xff0c;要考虑在ni的范围内考虑多种路线取最优&#xff0c;所以用动态规划 如何用动态规划呢&#xff1f; 答&#xff1a;…