编辑
2025-02-07
C# 应用
00
请注意,本文编写于 88 天前,最后修改于 88 天前,其中某些信息可能已经过时。

目录

准备工作
创建基本热力图
自定义热力图
使用实际数据创建热力图
交互式热力图
结论

在WinForms中使用OxyPlot创建热力图的详细指南。热力图是一种非常有效的可视化工具,用于表示二维数据的密度或强度。它通过颜色变化来展示数据的分布情况,非常适合用于展示温度分布、人口密度、金融数据等多种场景。

准备工作

首先,我们需要在项目中添加OxyPlot的引用。您可以通过NuGet包管理器来安装OxyPlot。在Visual Studio中,右击您的项目,选择"管理NuGet包",然后搜索并安装以下包:

  • OxyPlot.Core
  • OxyPlot.WindowsForms

安装完成后,在您的代码文件顶部添加以下using语句:

C#
using OxyPlot; using OxyPlot.Series; using OxyPlot.WindowsForms; using OxyPlot.Axes;

创建基本热力图

让我们从一个简单的热力图开始。假设我们要展示一个5x5的温度数据矩阵。

C#
public partial class Form1 : Form { public Form1() { InitializeComponent(); CreateBasicHeatMap(); } private void CreateBasicHeatMap() { var plotView = new PlotView(); plotView.Dock = DockStyle.Fill; var model = new PlotModel { Title = "基本热力图" }; // 创建热力图数据 double[,] data = new double[5, 5]; for (int x = 0; x < 5; x++) { for (int y = 0; y < 5; y++) { data[x, y] = Math.Sin(x * 0.5) * Math.Cos(y * 0.5); } } var heatMapSeries = new HeatMapSeries { X0 = 0, X1 = 4, Y0 = 0, Y1 = 4, Interpolate = true, RenderMethod = HeatMapRenderMethod.Bitmap, Data = data }; model.Series.Add(heatMapSeries); // 添加颜色轴 model.Axes.Add(new LinearColorAxis { Position = AxisPosition.Right, Palette = OxyPalettes.Rainbow(100) }); plotView.Model = model; this.Controls.Add(plotView); } }

image.png

这段代码创建了一个基本的5x5热力图,使用正弦和余弦函数生成数据,并使用彩虹色调展示。

自定义热力图

现在,让我们创建一个更复杂的热力图,展示某城市一周内每小时的温度变化。

C#
using OxyPlot.Series; using OxyPlot.WindowsForms; using OxyPlot; using OxyPlot.Legends; using OxyPlot.Axes; using OxyPlot.Annotations; namespace OxyApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); CreateCustomHeatMap(); } private void CreateCustomHeatMap() { var plotView = new PlotView(); plotView.Dock = DockStyle.Fill; var model = new PlotModel { Title = "一周温度变化热力图" }; // 创建热力图数据 double[,] data = new double[7, 24]; Random rand = new Random(0); for (int day = 0; day < 7; day++) { for (int hour = 0; hour < 24; hour++) { // 模拟温度数据:基础温度 + 日变化 + 随机波动 data[day, hour] = 20 + 5 * Math.Sin(hour * Math.PI / 12) + rand.NextDouble() * 2; } } var heatMapSeries = new HeatMapSeries { X0 = 0, X1 = 23, Y0 = 0, Y1 = 6, Interpolate = false, RenderMethod = HeatMapRenderMethod.Rectangles, Data = data }; model.Series.Add(heatMapSeries); // 自定义X轴(小时) model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Title = "小时", MajorStep = 4, MinorStep = 1, Minimum = 0, Maximum = 23 }); // 自定义Y轴(星期) model.Axes.Add(new CategoryAxis { Position = AxisPosition.Left, Title = "星期", ItemsSource = new[] { "周一", "周二", "周三", "周四", "周五", "周六", "周日" } }); // 添加颜色轴 model.Axes.Add(new LinearColorAxis { Position = AxisPosition.Right, Palette = OxyPalettes.Hot(200), Title = "温度 (°C)", Minimum = 15, Maximum = 30 }); plotView.Model = model; this.Controls.Add(plotView); } } }

image.png

这个例子创建了一个更复杂的热力图,展示了一周内每小时的温度变化。我们使用了自定义的坐标轴和颜色轴,以及更真实的数据模拟。

使用实际数据创建热力图

接下来,让我们使用一些"实际"数据创建一个热力图,比如某公司各部门在不同季度的收入数据。

C#
using OxyPlot.Series; using OxyPlot.WindowsForms; using OxyPlot; using OxyPlot.Legends; using OxyPlot.Axes; using OxyPlot.Annotations; namespace OxyApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); CreateRealDataHeatMap(); } private void CreateRealDataHeatMap() { var plotView = new PlotView(); plotView.Dock = DockStyle.Fill; var model = new PlotModel { Title = "部门季度收入热力图" }; // 模拟实际数据 string[] departments = { "销售", "市场", "研发", "客服", "财务" }; string[] quarters = { "Q1", "Q2", "Q3", "Q4" }; double[,] incomeData = { { 100, 120, 130, 110 }, { 80, 90, 100, 95 }, { 70, 75, 80, 85 }, { 50, 55, 60, 58 }, { 30, 35, 32, 38 } }; var heatMapSeries = new HeatMapSeries { X0 = 0, X1 = 3, Y0 = 0, Y1 = 4, Interpolate = false, RenderMethod = HeatMapRenderMethod.Rectangles, Data = incomeData }; model.Series.Add(heatMapSeries); // 自定义X轴(季度) model.Axes.Add(new CategoryAxis { Position = AxisPosition.Bottom, Title = "季度", ItemsSource = quarters }); // 自定义Y轴(部门) model.Axes.Add(new CategoryAxis { Position = AxisPosition.Left, Title = "部门", ItemsSource = departments }); // 添加颜色轴 model.Axes.Add(new LinearColorAxis { Position = AxisPosition.Right, Palette = OxyPalettes.Cool(200), Title = "收入 (万元)", Minimum = 30, Maximum = 130 }); plotView.Model = model; this.Controls.Add(plotView); } } }

image.png

这个例子使用了模拟的公司部门季度收入数据创建热力图。我们使用了类别轴来表示部门和季度,使得图表更加直观。

交互式热力图

最后,让我们创建一个交互式热力图,允许用户点击热力图的单元格来查看详细信息。

C#
using OxyPlot.Series; using OxyPlot.WindowsForms; using OxyPlot; using OxyPlot.Legends; using OxyPlot.Axes; using OxyPlot.Annotations; namespace OxyApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); CreateInteractiveHeatMap(); } private void CreateInteractiveHeatMap() { var plotView = new PlotView(); plotView.Dock = DockStyle.Fill; var model = new PlotModel { Title = "交互式热力图" }; // 创建热力图数据 double[,] data = new double[10, 10]; Random rand = new Random(0); for (int x = 0; x < 10; x++) { for (int y = 0; y < 10; y++) { data[x, y] = rand.NextDouble() * 100; } } var heatMapSeries = new HeatMapSeries { X0 = 0, X1 = 9, Y0 = 0, Y1 = 9, Interpolate = false, RenderMethod = HeatMapRenderMethod.Rectangles, Data = data }; model.Series.Add(heatMapSeries); // 添加颜色轴 model.Axes.Add(new LinearColorAxis { Position = AxisPosition.Right, Palette = OxyPalettes.Viridis(200) }); plotView.Model = model; // 添加点击事件 plotView.MouseDown += (sender, e) => { var point = plotView.ActualModel.DefaultXAxis.InverseTransform(e.X, e.Y, plotView.ActualModel.DefaultYAxis); int x = (int)Math.Round(point.X); int y = (int)Math.Round(point.Y); if (x >= 0 && x < 10 && y >= 0 && y < 10) { double value = data[x, y]; MessageBox.Show($"位置: ({x}, {y}), 值: {value:F2}", "单元格信息"); } }; this.Controls.Add(plotView); } } }

image.png

这个交互式热力图允许用户点击任何单元格来查看其具体数值。这种功能对于探索复杂的数据集非常有用。

结论

通过这些例子,您应该已经掌握了如何在WinForms应用中使用OxyPlot创建各种类型的热力图。从基本的数据可视化到复杂的交互式图表,OxyPlot都提供了强大的支持。

热力图是一种非常有效的数据可视化工具,特别适合展示大量的二维数据。它可以快速地帮助用户识别数据中的模式、趋势和异常值。在实际应用中,您可能需要根据具体的数据特性和展示需求来调整颜色方案、轴标签和其他视觉元素。

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!