indowsForm平台下创建图表、Visual Studio 自带的Chart很有名气、但是在WPF平台下却不支持。
2016年左右,WPT Toolkit组件中提供了(WPF Toolkit Data Visualization Controls),但是现在似乎也已弃用。
在业务中,我需要从数据库或CSV文件中读取数据并创建图表,因此,当我搜索一些看起来是免费的、可用的图表时,我发现了以下四种。
这一次,我想使用一个简单的事例来表明每一个控件的差异。
目录
OxyPlot
公式サイト | OxyPlot |
文档 | Welcome to OxyPlot’s documentation! — OxyPlot 2015.1 documentation |
手册 | https://readthedocs.org/projects/oxyplot/downloads/pdf/latest/ |
安装 | Nuget下搜索 “oxyplot”、”OxyPlot.Wpf” 选择安装 |
相关文章 | OxyPlotのグラフ描画に関する概要をもっと知りたい方はこちら コピペで使えるソースコード(関数化したもの)が欲しい方はこちら |
官方网站上的信息有点难以理解,许多地方的描述和图表示例不一致。
PDF 手册也已发布,但似乎在 2015 年的旧版本中被忽略。
但是,在“oxyplot”中搜索会命中大量信息,因此,如果您收集这些信息,您就会承受相当大的工作。
WPF,但已成为一个有意识的MVVM,它也可以用于编写C#代码,如Windows窗体。
下面是可以使用 OxyPlot 创建的图表的示例。
LiveCharts
官方网站 | Live Charts |
文档 | Live Charts |
安装 | Nuget下搜索 “livecharts”、”LiveCharts.Wpf” 选择安装 |
相关文章 | LiveCharsのグラフ描画に関する概要をもっと知りたい方はこちら コピペで使えるソースコード(関数化したもの)が欲しい方はこちら |
与 OxyPlot 相比,官方网站上的信息更丰富,可以绘制的图表类型也更丰富。
毕竟,它看起来很漂亮,动画绘制的点也引人注目,但很难说绘制速度太慢。
100 个左右没有问题,但每次在 10,000 个点绘制图形时,每次调整屏幕大小时,您都会等待。
由于您可以选择停止动画,因此绘图速度会提高,但仍会远远落后于其他图表库。
付费的高速版“实时字符齿轮”售价约为7000日元,这里可以毫无问题地绘制1000万点。
下面是可以使用实时图表绘制的图表示例。
ScottPlot
官方网站 | ScottPlot |
文档 | ScottPlot 4.0.47 Cookbook |
安装 | Nuget下搜索 “scottplot”、”ScottPlot.Wpf” 选择安装 |
相关文章 | ScottPlotのグラフ描画に関する概要をもっと知りたい方はこちら コピペで使えるソースコード(関数化したもの)が欲しい方はこちら |
绘制速度与Visual Stuido下的标准Chart一样。
与OxyPlot、 LiveCharts 相比较,ScottPlot更快。
与Visual Stuido标准Chart相比,图表类型更加丰富,且视觉表现上更加漂亮。
官方网站上的手册是实质性的,但是信息不会击中很多,使用者也很少。
即使出现问题,也只有依靠官方网站上的信息来自己解决它,我最喜欢这个。
MSChart
官方网站 | Chart クラス (System.Windows.Forms.DataVisualization.Charting) | Microsoft Docs |
安装 | Visual Studio自带,不需要安装。 只需应用System.Windows.Forms.DataVisualization 以及 System.Windows.Forms 即可。 |
相关文章 | MSChartのグラフ描画に関する概要をもっと知りたい方はこちら コピペで使えるソースコード(関数化したもの)が欲しい方はこちら |
Visual Studio 标准Windows Form 平台下使用的图标控件,WPF平台通过WindowsFormsHost 组件嵌入使用。
Microsoft官方网站有说明,但是并不容易看懂。
与其他图表库比较,这个更加难以理解。
但是,由于WindowsForm平台的信息比较丰富,这就补足了它的不全。
可以创建3D类型的图表,这是其他图表库中没有的功能。并且可以绘制的图标种类繁多。
虽然需要编写一些代码,单支持鼠标放大和缩小,以及像ScottPlot一样的快速绘制图表,设计时比其他图表库更令人着迷。
然而,你可以写一个相当不错的图表,如果你努力工作,所以也许蚂蚁会尝试这个。
四个图表库的设计比较
为了进行比较,我使用每个库绘制了四个图表。
由于散点图的点的初始值是圆形或方形的,隐私他们统一为圆形,除此之外,很少设置属性。隐私你可以看到初始值的设置。
1.OxyPlot
由于饼图的文本颜色为黑色,所以很难看,并且中间的数字可能看起来已消失。
增加图表的大小后,饼图中的所有数字都会显示出来。
我想使饼图字符为白色,但由于无法单独指定饼图中字符和标注字符的颜色,因此,如果将其设置为白色,则标注字符和线条将消失。 是指定饼图的颜色,将文本颜色设置为白色,放弃标注,还是找到可以同时显示两者的图表颜色和文本颜色。
2.LiveCharts
如果指定了任何内容,则绘制的点直径较大。
饼图看起来不错,因为他们是浅色配色方案,由白色分隔。
我担心的是最右边的条形图,其省略了字符。
我找不到显示他的方法,如果没有这样的选项,这是一个麻烦。
由于通过增加绘图区域来显示最后的内容,隐私最好以具有空间的大小进行绘制。
此外,标题不可见,因为找不到标题显示属性。
也许,他根本不存在吧。
3.ScottPlot
这里没有部分被看完,也没有被省略。
尺寸界面显示为薄,因此很容易看到。
4.Microsoft Chart
与ScottPlot一样,没有遗漏。
饼图中的字符与OxyPlot一样为黑色,因此我想将它改为白色。
此外,与ScottPlot相比,深色辅助线颜色太重。
折线图示例比较
我想查看每个库的折线图示例。
通过比较源码,你可以了解图表绘制的概念。
它使用折线图的示例源码来进行方法化,并将绘图数据传递给第一个参数,控件,第二个参数,标题,第三个和第四个参数。
OxyPlot折线图示例源
C#
1 2 3 4 5 6 7 8 9 10 11 12 | private void DrawLine(OxyPlot.Wpf.PlotView chart, string title, double[] xs, double[] ys) { PlotModel model = new PlotModel() { Title = title }; model.Axes.Add(new OxyPlot.Axes.LinearAxis() { Position = AxisPosition.Bottom }); model.Axes.Add(new OxyPlot.Axes.LinearAxis() { Position = AxisPosition.Left }); LineSeries seri = new LineSeries(); seri.Points.AddRange(Enumerable.Range(0, ys.Length).Select(i => new DataPoint(xs[i], ys[i]))); model.Series.Add(seri); chart.Model = model; } |
对于名为PlotModel的类,你将注册纵轴、横轴以及曲线类、最后将PlotModel设置为控件的Model属性。
Axis、Series、数据类(折线图使用DataPoint)必须使用每种图表类型提供的数据类。
LiveCharts折线图示例源
C#
1 2 3 4 5 6 7 8 | private void DrawLine(CartesianChart chart, string title, double[] xs, double[] ys) { chart.Series.Clear(); LineSeries seri = new LineSeries(); seri.Values = new ChartValues<ObservablePoint>(Enumerable.Range(0, ys.Length).Select(i => new ObservablePoint(xs[i], ys[i]))); chart.Series.Add(seri); } |
在为每种图表类型准备的Series类中,通过创建绘图数据并最后在控件的Series属性中添加图表来显示图表。
这里可以省略Axis类。但是Series和绘图数据必须存储在根据图表类型确定的类中。
ScottPlot折线图示例源
C#
1 2 3 4 5 6 7 8 | private void DrawLine(WpfPlot chart, string title, double[] xs,double[] ys) { chart.plt.Clear(); chart.plt.Title(title); chart.plt.PlotSignalXY(xs,ys); chart.Render(); } |
通过在控件的plt属性中注册标题和绘图数据,最后调用控件的Render方法来显示图表。
与其他库相比,它非常简单。
创建绘图数据的方法必须使用每种图表类型提供的方法。
Microsoft Chart折线图示例源
C#
1 2 3 4 5 6 7 8 9 10 11 12 13 | private void DrawLine(Chart chart, string title, double[] xs, double[] ys) { chart.Titles.Clear(); chart.ChartAreas.Clear(); chart.Series.Clear(); chart.ChartAreas.Add(new ChartArea()); Series seri = new Series() { ChartType = SeriesChartType.Line }; Enumerable.Range(0, ys.Length).Select(i => seri.Points.AddXY(xs[i], ys[i])).ToArray(); chart.Titles.Add(title); chart.Series.Add(seri); } |
这需要将ChartArea类的实例添加到ChartAreas属性里,以便图表绘制。
与其他库不同,只有一个Series类可以保存绘图数据。
相反,在生成Series类的实例时,将图表类型设置为ChartType。
之后,在系列类中注册绘图数据与其他库相同。。
但是,尽管其他库存储没中图表类型的绘图数据的类不同,但对于Microsoft Chart图表,无论图表类型如何,AddXY方法足可。
这是因为AddXY方法的第一个参数是Object类型,可以接受实数和字符串,但内部似乎根据ChartType进行了适当的转换。
你推荐哪一个
我根据以前的调查制作了比较表如下。
库名称 | 安装 | 好看 | 速度 | 手册等 | 专有技术文章 |
---|---|---|---|---|---|
OxyPlot | 必要 | △ | ○ | ○ | △ |
LiveCharts | 必要 | ◎ | × | ○ | △ |
ScottPlot | 必要 | ○ | ◎ | ◎ | × |
Microsoft Chart | 不要 | △ | ◎ | × | ◎ |
如果以绘制大量数据的速度为准,则Microsoft Chart、ScattPlot最好。
如果为了绘图方便,则ScattPlot是最佳选择。
如果你想专注于设计或制作动画,LiveCharts是个不错的选择。
如果你想实现一个类似EXCEL的3D图表的东西,那就只能用Microsoft Chart。
OxyPlot是ScottPlot和LiveCharts的中间存在么・・・
总结
作为WPF中使用的免费图表库,我们比较了四种类型的图表: OxyPlot、LiveCharts、ScottPlot、Microsoft Chart。我使用我自己的印象、实际绘制结果与源代码进行比较。
哪一个更好取决与您的用途,因此请参阅本文以查找适合您的用途的图表库。
原文如下