设为首页 加入收藏

TOP

WPF在Canvas中绘图实现折线统计图(三)
2017-10-10 12:44:51 】 浏览:6048
Tags:WPF Canvas 绘图 实现 统计
>
2 /// 添加刻度标签 3 /// </summary> 4 private void DrawScaleLabel(List<double> list) 5 { 6 for (int i = 1; i < 13; i++) 7 { 8 TextBlock x_ScaleLabel = new TextBlock(); 9 x_ScaleLabel.Text = NumberToChinese(i.ToString()); 10 if (x_ScaleLabel.Text == "一零") 11 { 12 x_ScaleLabel.Text = ""; 13 Canvas.SetLeft(x_ScaleLabel, 40 + 45 * i - 6); 14 } 15 else if (x_ScaleLabel.Text == "一一") 16 { 17 x_ScaleLabel.Text = "十一"; 18 Canvas.SetLeft(x_ScaleLabel, 40 + 45 * i - 10); 19 } 20 21 else if (x_ScaleLabel.Text == "一二") 22 { 23 x_ScaleLabel.Text = "十二"; 24 Canvas.SetLeft(x_ScaleLabel, 40 + 45 * i - 10); 25 } 26 else 27 { 28 Canvas.SetLeft(x_ScaleLabel, 40 + 45 * i - 6); 29 } 30 Canvas.SetTop(x_ScaleLabel, 320 + 2); 31 this.chartCanvas.Children.Add(x_ScaleLabel); 32 } 33 34 for (int i = 1; i < 6; i++) 35 { 36 TextBlock y_ScaleLabel = new TextBlock(); 37 double max = Math.Ceiling(list.Max() / 100) * 100; 38 y_ScaleLabel.Text = (i * (max/5)).ToString(); 39 Canvas.SetLeft(y_ScaleLabel, 40 - 30); 40 Canvas.SetTop(y_ScaleLabel, 320 - 5 * 10 * i - 6); 41 42 this.chartCanvas.Children.Add(y_ScaleLabel); 43 } 44 } 45 46 /// <summary> 47 /// 数字转汉字 48 /// </summary> 49 /// <param name="numberStr"></param> 50 /// <returns></returns> 51 public static string NumberToChinese(string numberStr) 52 { 53 string numStr = "0123456789"; 54 string chineseStr = "零一二三四五六七八九"; 55 char[] c = numberStr.ToCharArray(); 56 for (int i = 0; i < c.Length; i++) 57 { 58 int index = numStr.IndexOf(c[i]); 59 if (index != -1) 60 c[i] = chineseStr.ToCharArray()[index]; 61 } 62 numStr = null; 63 chineseStr = null; 64 return new string(c); 65 }

 

接下来就是计算数据点了,难点在于计算像素点,X轴是固定的,所以不用关注

直接算好的X轴十二个数值

double[] left = { 85, 130, 175, 220, 265, 310, 355, 400, 445, 490, 535, 580 };

而Y轴就要自己算了,提供一个思路:

区域总像素 - 区域总像素 * (数值/最大值)

 
 
 1         /// <summary>
 2         /// 计算数据点并添加
 3         /// </summary>
 4         /// <param name="list"></param>
 5         private void DrawPoint(List<double> list)
 6         {
 7             double[] left = { 85, 130, 175, 220, 265, 310, 355, 400, 445, 490, 535, 580 };
 8             List<double> leftlist = new List<double>();
 9             leftlist.AddRange(left);
10 
11             for (int i = 1; i < 13; i++)
12             { 
13                 Ellipse Ellipse = new Ellipse();
14                 Ellipse .Fill = new SolidColorBrush(Color.FromRgb(0, 0, 0xff));
15                 Ellipse .Width = 8;
16                 Ellipse .Height = 8;
17                 Canvas.SetLeft(Ellipse,leftlist[i-1]- 4);
18                 double y_Max = Math.Ceiling(list.Max() / 100) * 100;
19                 Canvas.SetTop(Ellipse, 320 - 250 * (list[i-1] / y_Max) - 4); 
20                 coordinatePoints.Add(new Point(leftlist[i-1], 320 - 250 * (list[i-1] / y_Max)));
21                 this.chartCanvas.Children.Add(Ellipse);
22                 //值显示
23                 TextBlock EP_Label = new TextBlock();
24                 EP_Label.Foreground = System.Windows.Media.Brushes.Red;
25                 EP_Label.Text = list[i-1].ToString();
26                 Canvas.SetLeft(EP_Label, leftlist[i-1] - 10);
27                 Canvas.SetTop(EP_Label, 320 - 250 * (list[i-1] / y_Max) - 20);
28                 this.chartCanvas.Children.Add(EP_Label);
29             }
30         }
 
 

在绘制数据点的时候,每一次的位置都保存了:  coordinatePoints.Add(new Point(leftlist[i-1], 320 - 250 * (list[i-1] / y_Max)));

先得定义:

/// <summary>
        /// 折线图坐标点
        /// </summary>
        private PointCollection coordinatePoints = new PointCollection();

最后直接连连看就好了

 1         /// <summary>
 2         /// 绘制连接折线
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇浅谈.net MVC 下一篇.Net修改网站项目调试时的虚拟目录

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目