WPF图表Live Charts(三)柱状图

简介

前面介绍了Live Charts的基础和设置,接下介绍一下如何实现一个柱状图。该柱状图主要实现打开多个文件,读取文件的多个数据并显示的功能。

效果预览

在这里插入图片描述
打开多个数据文件,同时读取文件的文件的大小,文件的的温度数据,分两个Y轴显示,同时有各自的单位。

前台代码
<Grid >
        <lvc:CartesianChart Series="{Binding SeriesCollection}" LegendLocation="Top">
            <lvc:CartesianChart.AxisX>
                <lvc:Axis Title="fielname" Labels="{Binding Labels}" FontSize="14"></lvc:Axis>
            </lvc:CartesianChart.AxisX>
            <lvc:CartesianChart.AxisY>
                <lvc:Axis x:Name="axisT"  LabelFormatter="{Binding FormatterT}" Foreground="DodgerBlue" FontSize="14" />
                <lvc:Axis x:Name="axisS"  LabelFormatter="{Binding FormatterS}" Foreground="IndianRed" Position="RightTop" FontSize="14" />
            </lvc:CartesianChart.AxisY>
        </lvc:CartesianChart>
        <Button x:Name="button_open" Content="open" HorizontalAlignment="Right" VerticalAlignment="Top" Width="40" Click="button_openClick" 
                Background="{x:Null}" BorderBrush="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" 
                Foreground="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" Opacity="0.5" Height="20"/>
    </Grid>
后台代码
   public partial class MainWindow : Window
    {
        public Func<double, string> FormatterT { get; set; }
        public Func<double, string> FormatterS { get; set; }
        public SeriesCollection SeriesCollection { get; set; }
        public string[] Labels { get; set; }

        List<double> filesize = new List<double>();
        List<string> filenames = new List<string>();
        List<double> temperature = new List<double>();

        //新建一条文件大小的柱状图
        ColumnSeries sizeseries = new ColumnSeries();
        //新建一条温度的柱状图
        ColumnSeries templeseries = new ColumnSeries();
        public MainWindow()
        {			
            InitializeComponent();

            //添加两个纵坐标的单位
            FormatterT = value => value + "C°";
            FormatterS = value => value + "KB";

            templeseries.Title = "temp";
            //温度的柱状图依赖于第一条纵坐标
            templeseries.ScalesYAt = 0;
            axisT.Title = "temp/C°";

            sizeseries.Title = "size";
            //文件大小的柱状图依赖于第二条纵坐标
            sizeseries.ScalesYAt = 1;
            axisS.Title = "size/KB";

            SeriesCollection = new SeriesCollection { };
            SeriesCollection.Add(templeseries);
            SeriesCollection.Add(sizeseries);
            
            //绑定数据
            DataContext = this;
        }
        public  void button_openClick(object sender, RoutedEventArgs e)
        {
            filenames.Clear();
            filesize.Clear();
            temperature.Clear();
            OpenFileDialog open_files = new OpenFileDialog();
            //打开多个文件
            open_files.Multiselect = true;
            if (open_files.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                foreach (string file in open_files.FileNames)
                {
                    FileInfo MyFileInfo = new FileInfo(file);
                    //获取文件的大小
                    filesize.Add((int )MyFileInfo.Length/1024  );
                    //获取文件的名称
                    filenames.Add (System.IO.Path.GetFileNameWithoutExtension(file));
                    //通过正则表达式获取文件中的数据信息
                    StreamReader sr = new StreamReader(file);
                    string pattern = @"DHT11 temp:([0-9]+(.[0-9]{1,3})?),";
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        Regex r = new Regex(pattern , RegexOptions.None);
                        Match mc = r.Match(line );
                        string tempStr = mc.Groups[1].Value;
                        temperature.Add (Convert.ToDouble (tempStr));
                        break;
                    }
                    sr.Close();
                }         
            }
            Labels = filenames.ToArray();
            templeseries.Values = new ChartValues<double>(temperature);
            sizeseries.Values = new ChartValues<double>(filesize);
        }     
    }
  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要实现WPF LiveCharts柱状图的动态刷新显示,您可以使用LiveCharts提供的ObservablePoint集合来存储数据,并使用SeriesCollection来管理多个柱状图系列。然后,在将ObservablePoint添加到SeriesCollection之后,您可以在需要更新图表时更新ObservablePoint的值,然后使用Chart.Refresh()方法来刷新图表。 以下是一个示例代码片段,该代码片段使用具有两个柱状图系列的SeriesCollection,并使用Random对象模拟动态数据更新: ``` // 创建一个SeriesCollection以管理多个柱状图系列 SeriesCollection seriesCollection = new SeriesCollection(); // 创建两个柱状图系列 ColumnSeries series1 = new ColumnSeries { Title = "Series 1", Values = new ObservableCollection<ObservablePoint>() }; ColumnSeries series2 = new ColumnSeries { Title = "Series 2", Values = new ObservableCollection<ObservablePoint>() }; // 将柱状图系列添加到SeriesCollection seriesCollection.Add(series1); seriesCollection.Add(series2); // 将ObservablePoint添加到每个柱状图系列 for (int i = 0; i < 10; i++) { series1.Values.Add(new ObservablePoint(i, 0)); series2.Values.Add(new ObservablePoint(i, 0)); } // 将SeriesCollection设置为图表的数据源 yourChart.Series = seriesCollection; // 模拟动态数据更新 Random random = new Random(); while (true) { // 更新ObservablePoint的值 for (int i = 0; i < 10; i++) { series1.Values[i].Y = random.Next(1, 100); series2.Values[i].Y = random.Next(1, 100); } // 刷新图表 yourChart.Refresh(); // 等待一段时间,然后再次更新数据 Thread.Sleep(1000); } ``` 请注意,这只是一个示例代码片段,您需要根据您的实际情况进行修改和调整。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值