C# ScottPlot
最后修改于 2023 年 7 月 5 日
在本文中,我们将展示如何使用 ScottPlot 库在 C# 中生成图表。
ScottPlot 是一个用于在 .NET 中创建图表的开源库。 我们可以创建各种类型的图表,包括散点图、折线图、条形图、饼图或烛台图。
$ dotnet add package ScottPlot
我们将库添加到项目中。
折线图示例
折线图是一种基本的图表类型,它将信息显示为一系列由线段连接的数据点。 这些线可以是直线或曲线。
using ScottPlot; using System.Drawing; var plt = new ScottPlot.Plot(600, 400); double[] xs = DataGen.Consecutive(51); double[] ys = DataGen.Sin(pointCount:51, offset:10); plt.AddScatterLines(xs, ys, Color.Red, 3); plt.SaveFig("lineplot.png");
在此示例中,我们创建一个简单的折线图。 我们将图表保存为 PNG 图像。
var plt = new ScottPlot.Plot(600, 400);
我们创建一个 600x400 的可绘制对象。
double[] xs = DataGen.Consecutive(51);
对于 x 值,我们使用 DataGen.Consecutive
方法生成一个具有恒定间距的数字数组。
double[] ys = DataGen.Sin(pointCount:51, offset:10);
对于 y 值,我们使用 DataGen.Sin
函数生成一个数值数组。
plt.AddScatterLines(xs, ys, Color.Red, 3);
我们使用 AddScatterLines
将折线图添加到可绘制对象。 我们提供 x 和 y 值,线条的颜色和线条的宽度。
plt.SaveFig("lineplot.png");
在下一个示例中,我们绘制一个 cos 函数。
using ScottPlot; using System.Drawing; var plt = new ScottPlot.Plot(600, 400); double[] xs = DataGen.Consecutive(100); double[] ys = DataGen.Cos(pointCount:100, offset:10); plt.AddScatterLines(xs, ys, Color.Blue, 2, LineStyle.Dash); plt.SaveFig("lineplot2.png");
该线是蓝色的,其样式是虚线。
图表标题、标签和边距
在以下示例中,我们设置图表标题、标签和边距。
using ScottPlot; var plt = new ScottPlot.Plot(650, 450); plt.AddSignal(DataGen.Sin(51)); plt.AddSignal(DataGen.Cos(51)); plt.Margins(x: .15, y: .15); plt.Style(Style.Gray1); plt.Title("Signal plot"); plt.XLabel("x values"); plt.YLabel("y values"); plt.Layout(top: 30, bottom: 30); plt.SaveFig("labels.png");
该程序绘制两个图表:sin 和 cos 函数。
plt.AddSignal(DataGen.Sin(51)); plt.AddSignal(DataGen.Cos(51));
使用 AddSignal
,我们生成渲染速度非常快的折线图。
plt.Margins(x: .15, y: .15);
我们使用 Margins
设置边距。 数据占据 85% 的水平和垂直空间。
plt.Style(Style.Gray1);
我们使用 Style
设置图表样式。
plt.Title("Signal plot");
图表的标题使用 Title
设置。
plt.XLabel("x values"); plt.YLabel("y values");
我们设置 x 和 y 标签。
plt.Layout(top: 30, bottom: 30);
我们设置整个图表周围的填充。
时间序列
时间序列是跟踪一段时间内样本的数据集。
using ScottPlot; var plt = new ScottPlot.Plot(600, 400); var now = DateTime.UtcNow; var begin = now.AddDays(-30); DateTime[] myDates = new DateTime[30]; for (int i = 0; i < myDates.Length; i++) { myDates[i] = now.AddDays(i + 1); } double[] xs = myDates.Select(x => x.ToOADate()).ToArray(); double[] ys = DataGen.RandomWalk(myDates.Length); plt.AddScatter(xs, ys); plt.XAxis.DateTimeFormat(true); plt.SaveFig("plot.png");
在该程序中,我们绘制时间序列数据。
var now = DateTime.UtcNow; var begin = now.AddDays(-30);
我们绘制过去三十天的数据。
DateTime[] myDates = new DateTime[30]; for (int i = 0; i < myDates.Length; i++) { myDates[i] = now.AddDays(i + 1); }
我们创建一个包含三十个 DateTime 值的数组。
double[] xs = myDates.Select(x => x.ToOADate()).ToArray();
在绘图之前,我们将 DateTimes 转换为 double 类型。
double[] ys = DataGen.RandomWalk(myDates.Length);
我们使用 DataGen.RandomWalk
生成一个随机 double 值数组。
plt.AddScatter(xs, ys);
我们将图表添加到可绘制对象。
plt.XAxis.DateTimeFormat(true);
我们使用时间格式显示刻度标签。
条形图示例
条形图使用矩形条呈现分组数据,条的长度与它们表示的值成比例。 这些条可以垂直或水平绘制。
using System.Drawing; var plt = new ScottPlot.Plot(650, 450); double[] positions = { 0, 1, 2, 3 }; double[] values = { 26, 20, 23, 7 }; string[] labels = { "Product A", "Product B", "Product C", "Product D" }; plt.Title("Sales"); var bar = plt.AddBar(values, positions); bar.FillColor = Color.SteelBlue; bar.BorderColor = Color.SteelBlue; bar.ShowValuesAboveBars = true; bar.Font.Color = Color.SteelBlue; bar.Font.Size = 16; bar.Font.Bold = true; plt.XTicks(positions, labels); plt.SetAxisLimits(yMin: 0); plt.SaveFig("barchart.png");
该程序使用条形图绘制四种产品的销售额。
double[] positions = { 0, 1, 2, 3 }; double[] values = { 26, 20, 23, 7 }; string[] labels = { "Product A", "Product B", "Product C", "Product D" };
我们定义 x 和 y 值以及标签。
var bar = plt.AddBar(values, positions);
我们使用 AddBar
创建一个条形图。
bar.FillColor = Color.SteelBlue; bar.BorderColor = Color.SteelBlue;
我们设置条的填充和边框颜色。
bar.ShowValuesAboveBars = true;
我们在条上方显示值。
bar.Font.Color = Color.SteelBlue; bar.Font.Size = 16; bar.Font.Bold = true;
我们修改字体设置。
plt.XTicks(positions, labels);
我们设置刻度。 如果不手动设置,它们将自动生成。
plt.SetAxisLimits(yMin: 0);
我们设置 y 轴起点的距离。
在下一个示例中,我们绘制一个水平条形图。
using ScottPlot; var plt = new ScottPlot.Plot(650, 450); double[] positions = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; double[] values = { 543, 31, 5, 5, 22, 5, 37, 31, 27, 4, 6, 15, 49, 19, 7}; var oprs = new string[] { "Katarakta", "PPV /vitrektómia/", "Serkláž", "Operácia glaukómu", "Blefaroplastika", "Pterýgium", "Chalaseon", "Xantelazma", "Cysta+tu papil", "Entropium, Ektropium", "Elektrokoagulácia", "Laser sietnice", "Jag laser", "Iridotómia", "Iné", }; plt.Title("Očné operácie v nemocnici Agel Košice-Šaca za r. 2022"); plt.XLabel("Počet operácií"); plt.YTicks(positions, oprs); var bar = plt.AddBar(values, positions); bar.Orientation = Orientation.Horizontal; plt.YAxis.Layout(padding: 45); plt.SaveFig("barchart2.png");
该程序生成一个水平条形图,描述医院的眼科手术。
var oprs = new string[] { "Katarakta", "PPV /vitrektómia/", "Serkláž", "Operácia glaukómu", "Blefaroplastika", "Pterýgium", "Chalaseon", "Xantelazma", "Cysta+tu papil", "Entropium, Ektropium", "Elektrokoagulácia", "Laser sietnice", "Jag laser", "Iridotómia", "Iné", };
这些是各种眼科手术的名称。 我们选择水平条形图是因为这些名称对于垂直条形图来说太长了。
bar.Orientation = Orientation.Horizontal;
我们将图表方向设置为 Orientation.Horizontal
。
plt.YAxis.Layout(padding: 45);
我们为标签留出空间。
最后,我们将图表保存到 PNG 文件中。
来源
在本文中,我们使用 ScottPlot 库在 C# 中生成了图表。
作者
列出所有 C# 教程。