ZetCode

C# ScottPlot

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何使用 ScottPlot 库在 C# 中生成图表。

ScottPlot 是一个用于在 .NET 中创建图表的开源库。 我们可以创建各种类型的图表,包括散点图、折线图、条形图、饼图或烛台图。

$ dotnet add package ScottPlot

我们将库添加到项目中。

折线图示例

折线图是一种基本的图表类型,它将信息显示为一系列由线段连接的数据点。 这些线可以是直线或曲线。

Program.cs
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 函数。

Program.cs
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");

该线是蓝色的,其样式是虚线。

图表标题、标签和边距

在以下示例中,我们设置图表标题、标签和边距。

Program.cs
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);

我们设置整个图表周围的填充。

时间序列

时间序列是跟踪一段时间内样本的数据集。

Program.cs
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);

我们使用时间格式显示刻度标签。

条形图示例

条形图使用矩形条呈现分组数据,条的长度与它们表示的值成比例。 这些条可以垂直或水平绘制。

Program.cs
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 轴起点的距离。


在下一个示例中,我们绘制一个水平条形图。

Program.cs
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 食谱

在本文中,我们使用 ScottPlot 库在 C# 中生成了图表。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程