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# 教程。