WPF图表控件库

LiveCharts:

LiveCharts2预览版、内存管理不是很好,长时间持续更新的情况下,内存溢出,慎用

数据加载量不能太大(1000点左右 开始卡)

第一步:下载LiveChart NuGet包

第二步:引用:
 xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
第三步:使用:
折线图:CartesianChart
  1. XAML中使用:

一个图表对应多个序列,可以是多个折线图和多个柱状图

属性:

PointGeometrySize:折线图上的白点大小

LineSmoothness:折线图圆滑曲线

ScalesYAt:对齐到哪个Y轴(因为可以写多个Y轴,所以需要对应一下)

CartesianChart:设置坐标

AxisX:设置X坐标 需要Labels数量和Values数量保持一致

AxisY:纵坐标一般设置做大数值和最小数值

Separator:设置步长

Sections:设置预警线

<lvc:CartesianChart>
    <lvc:CartesianChart.Series>
        <lvc:LineSeries Values="23, 11, 99, 70, 87, 87, 84, 91, 55, 27, 79, 70, 70, 10, 14, 24, 27, 89, 61, 39" 
                Stroke="Orange" Fill="#1F00" PointGeometrySize="0" LineSmoothness="0" 
                Title="折线图"/>
        <lvc:ColumnSeries Values="23, 11, 99, 70, 87, 87, 84, 91, 55, 27, 79, 70, 70, 10, 14, 24, 27, 89, 61, 39"
                  Title="柱状图" ScalesYAt="0" MaxColumnWidth="20" Fill="Green"/>
    </lvc:CartesianChart.Series>

    <lvc:CartesianChart.AxisX>
        <lvc:Axis Labels="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v">
            <lvc:Axis.Separator>
                <lvc:Separator Step="1" Stroke="Red" StrokeDashArray="3,3"/>
            </lvc:Axis.Separator>
        </lvc:Axis>
    </lvc:CartesianChart.AxisX>
    
    <lvc:CartesianChart.AxisY>
        <lvc:Axis MinValue="0" MaxValue="100">
            <lvc:Axis.Separator>
                <lvc:Separator Step="20" Stroke="Green" StrokeDashArray="3,3" />
            </lvc:Axis.Separator>
            <lvc:Axis.Sections>
                <lvc:AxisSection Value="75" Stroke="Red" StrokeThickness="1" />
            </lvc:Axis.Sections>
        </lvc:Axis>

        <lvc:Axis MinValue="0" MaxValue="2" LabelFormatter="{Binding YLableFormatter}">
            <lvc:Axis.Separator>
                <lvc:Separator Step="0.4" StrokeDashArray="3,3" StrokeThickness="0" />
            </lvc:Axis.Separator>
        </lvc:Axis>
    </lvc:CartesianChart.AxisY>
    
</lvc:CartesianChart>

显示结果:

因为设置Y轴坐标的时候,是double类型,所以导致精度丢失,需要设置LabelFormatter

C#处理精度丢失代码:

// 保留两位小数
public Func<double, string> YLableFormatter { get; set; } = d =>d.ToString("0.00");

处理之后的效果: 没有问题

  1. C#中给表格赋值:

XAML代码:

<lvc:CartesianChart Series="{Binding SeriesList}"/>

C#赋值核心代码:

public SeriesCollection SeriesList { get; set; } = new SeriesCollection();

// 可以使用C#进行动态赋值
SeriesList.Add(new LineSeries
{
    Values = new ChartValues<double> { 75, 14, 36, 33, 89, 76, 23, 21, 77, 90, 21, 22, 54, 90, 32, 47, 97, 81, 63, 21 },
    Title = "压力",
    Stroke = Brushes.Green,
});

效果图:

环形图 :Gauge

属性

Uses360Mode:是否使用360度

From:从多少开始

To:到多少结束

Value:值多少

<lvc:Gauge Uses360Mode="True" From="0" To="100" Value="85" />

显示效果:

仪表盘:AngularGauge

属性:

Sections:仪表警戒线

FromValue:从多少位置开始

ToValue:到多少位置结束

LabelsStep:每一个的步长

TicksStep:小格的步长

Wedge:整个的角度

TicksForeground:刻度线的颜色

Foreground:字体颜色

SectionsInnerRadius:环形圆角度

Value:值

<lvc:AngularGauge Grid.Row="1" Grid.Column="1" FromValue="50" ToValue="250" LabelsStep="50" TicksStep="25" Wedge="270" TicksForeground="White"
                          Foreground="White" FontWeight="Bold" FontSize="16" SectionsInnerRadius="0.5" Value="180">
  <lvc:AngularGauge.Sections>
    <lvc:AngularSection FromValue="50" ToValue="200" Fill="Orange" />
    <lvc:AngularSection FromValue="200" ToValue="260" Fill="Red" />
  </lvc:AngularGauge.Sections>
</lvc:AngularGauge>

效果:

ScottPlot:考虑性能, 建议这个 号称500万点数据无压力

第一步:下载ScottPlot NuGet包

第二步:引用:
  xmlns:sp ="clr-namespace:ScottPlot;assembly=ScottPlot.Wpf"
第三步:使用:

注意:此控件只可以C#代码进行赋值

<sp:WpfPlot Name="wpf_plot" />

C#代码:

属性:

DataGen:模拟数据加载

Refresh():刷新表格 当数据变化的时候 刷新表格数据

YAxis:第一个Y轴

YAxis2:第二个Y轴

YAxisIndex:对应的Y轴

AddAxis:可以建立多个轴 XY都可以

ManualTickSpacing:轴显示的时间格式化

TickLabelFormat:刻度标签格式化

TickLabelStyle:标签样式

AddHorizontalLine:添加Y轴预警线

AddVerticalLine:添加X轴预警线

using ScottPlot;
using System.Windows;

namespace XH.CustomLesson.ChartLib
{
    /// <summary>
    /// ScottPlotTestWindow.xaml 的交互逻辑
    /// </summary>
    public partial class ScottPlotTestWindow : Window
    {
        public ScottPlotTestWindow()
        {
            InitializeComponent();

            this.Loaded += ScottPlotTestWindow_Loaded;
        }

        private void ScottPlotTestWindow_Loaded(object sender, RoutedEventArgs e)
        {
            // 数据加载
            var plt = wpf_plot.Plot;
            // 模拟序列数据
            double[] datas = DataGen.RandomWalk(new Random(),1000000);

            plt.AddSignal(datas);
            // 不调 Refresh 会报错 必须调用Refresh() 
            // YAxis:第一个Y轴
            // YAxis2:第二个Y轴
            plt.YAxis2.Ticks(true);
            plt.YAxis2.Color(System.Drawing.Color.Red);

            datas = DataGen.Cos(1000000);
            var series = plt.AddSignal(datas);
            //YAxisIndex 对应的Y轴 
            series.YAxisIndex = 1;

            // 可以有多个轴 第三个Y轴
            var yAxis3 = plt.AddAxis(ScottPlot.Renderable.Edge.Right,10,"新轴",System.Drawing.Color.Blue);
            datas = DataGen.Sin(1000000);
            series = plt.AddSignal(datas);
            series.YAxisIndex = 10;

            // 第二个X轴
            plt.XAxis2.Ticks(true);
            plt.XAxis2.Color(System.Drawing.Color.Green);
            datas = DataGen.Random(new Random(),100);
            var barPlot = plt.AddBar(datas, System.Drawing.Color.Orange);
            barPlot.XAxisIndex = 1;
            barPlot.YAxisIndex = 1;

            // 第三个X轴
            var xAxis3 = plt.AddAxis(ScottPlot.Renderable.Edge.Bottom,3, "第三个X轴", System.Drawing.Color.OrangeRed);
            xAxis3.Ticks(true);
            xAxis3.DateTimeFormat(true);
            // X轴时间格式化
            xAxis3.ManualTickSpacing(20, ScottPlot.Ticks.DateTimeUnit.Day);
            // 斜着显示
            xAxis3.TickLabelStyle(rotation: 45);

            // 第四个Y轴
            var yAxis4 = plt.AddAxis(ScottPlot.Renderable.Edge.Left,4, "第四个Y轴", System.Drawing.Color.OrangeRed);
            yAxis4.Ticks(true);
            yAxis4.DateTimeFormat(true);
            // Y轴格式化
            yAxis4.TickLabelFormat("P1", false);

            // 添加第三个数据序列 并且对齐到第三个X轴 和 第四个Y轴
            datas = DataGen.Sin(1000);
            double[] x_datas = new double[1000];
            DateTime dateTime = DateTime.Now;
            for (int i = 0; i < x_datas.Length; i++)
            {
                x_datas[i] = dateTime.AddDays(i).ToOADate();
            }    
            var scatterPlot = plt.AddScatterLines(x_datas, datas, System.Drawing.Color.Green);
            scatterPlot.YAxisIndex = 4;
            scatterPlot.XAxisIndex = 3;

            // 预警线
            var hl = plt.AddHorizontalLine(0.8, System.Drawing.Color.Red);
            // 对应到哪个Y轴
            //hl.YAxisIndex = 4;
            plt.AddVerticalLine(DateTime.Now.AddDays(50).ToOADate());

            wpf_plot.Refresh();
        }
    }
}

显示结果:

OxyPlot

LightingChart 付费

之前三此发的http://download.csdn.net/detail/maiker/9621027可以作废,本次为最新的,其中测试了历史曲线的动态显示,这是对Microsoft WpfToolkit的更新和扩展: 1、将版本升级到.NET 4.6.1,对命名控件进行了替换处理 2、实现了单数据Chart图的混合颜色显示,可通过修改资源字典调整和添加颜色 3、可控制各种Chart图形的数据值显示 4、坐标轴文本可倾斜显示 5、添加了StepLine图和圆环图,圆环半径比例系数可设定,同时添加了饼图的半径比系数,这样可以更好的控制饼图的标签显示,避免重叠 6、Legend可位于区域四侧,对齐方式也可以设定,以及是否显示, 可控制Chart Title是否显示 7、柱状图缝隙间隔可调整 8、全方面的加入了各种加载动画效果,动画效果可屏蔽,同时原系统自带动画效果,可叠加,这是两种不同的效果,可以互补性的单个使用 9、设计了四种主题颜色,各人可以针对图形颜色和背景色进行更好的搭配,在用户项目中,可以自己添加新的主题。 10、扩展了时间轴的应用,在新的DateTimeChart中可以通过鼠标平移和缩放时间轴,并测试了两个例子用于动态显示历史曲线,一个是外部定时更新,一个是内部定时更新 11、对LineDataPoint样式进行了设计,现在可以选择线图的点样式(如空心圆、五角星、三角形,矩形等),同时这些不同的点样式可以体现在Legend上,从而实现颜色和图形的双重区分。 总而言之,微软的控件做得很标准,还是很好修改的。 最后一直想在历史曲线中取消点动画(及默认的透明度动画),以便提高执行效率,但微软的那部分动画不熟,总是修改失败。 可以发邮件wuyang26@live.cn讨论。
非常好用的WPF控件是指在WPF应用程序开发中,提供了丰富、易用且功能强大的控件集合的开发工具。这些控件可以帮助开发人员更快速、高效地构建出现代化、具有吸引力的用户界面。 一个好用的WPF控件应该具有以下特点: 1. 丰富的控件选择:提供了大量常用的控件,如按钮、文本框、下拉框等基础控件,并且还包含了一些高级控件,如图表控件、日期选择器、树控件等,可以满足不同应用场景的需求。 2. 高度的可定制性:控件应该提供灵活的样式和模板机制,使开发人员可以根据自己的需求自定义控件的外观和行为,以实现与应用程序的整体风格和要求相匹配。 3. 良好的性能和高效的数据绑定:控件应该经过优化,确保在大数据量或复杂数据结构的情况下,控件仍能保持良好的性能。同时,应提供便捷的数据绑定机制,使开发人员能快速绑定数据并实现响应式UI。 4. 完善的文档和示例:控件应该提供清晰、详尽的文档,包括使用说明、示例代码和常见问题解答等,以帮助开发人员快速掌握和使用控件。 5. 良好的支持和更新:好的控件开发商应该提供及时的技术支持,并持续进行更新和改进,以适应不断变化的技术需求和市场需求。 总之,一个非常好用的WPF控件能够极大地提高开发效率和用户体验,帮助开发人员轻松实现复杂的界面设计和交互功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值