Telerik入门之Bar-多维数据绘制
前言
之前我们探究过Telerik入门—简单柱状图绘制,接下来我们来绘制多维(多系列)的数据。
一、对List进行扩展
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BNTU.Extensions
{
static class ListExtensions
{
/// <summary>
/// @描述:如果希望以differBy字段为聚合依据,获取该字段的取值集合
/// </summary>
/// <typeparam name="Table">哪一张表(实体对象模型)</typeparam>
/// <param name="data_List">那个数据集</param>
/// <param name="differBy">以该字段为聚合依据</param>
/// <returns>取值集合</returns>
public static List<string> GetDifferents<Table>(this List<Table> data_List, string differBy)
{
// 存储不同的系列依据
List<string> differ_List = new List<string>();
// 创建GroupBy字句的委托函数
Func<Table, string> groupByFunc =
delegate(Table table)
{
var value = typeof(Table).GetProperty(differBy).GetValue(table, null);
return value == null ? "NULL" : value.ToString();
};
// 开始聚合
List<IGrouping<string, Table>> table_Grouping_List = data_List.GroupBy(groupByFunc).ToList();
// 取出聚合之后的differBy(Key)的集合
foreach (IGrouping<string, Table> table_Grouping_Item in table_Grouping_List)
{
differ_List.Add(table_Grouping_Item.Key);
}
return differ_List;
}
/// <summary>
/// @描述:按照differBy进行划分,将原数据集按照DifferBy字段聚合之后的多组数据集
/// </summary>
/// <typeparam name="Table">哪一张表(实体对象模型)</typeparam>
/// <param name="data_List">那个数据集</param>
/// <param name="differBy">以该字段为聚合依据</param>
/// <returns>将原数据集按照DifferBy字段聚合之后的多组数据集</returns>
public static List<List<Table>> DifferBy<Table>(this List<Table> data_List, string differBy)
{
// 获取聚合依据的取值集合
List<string> differ_List = data_List.GetDifferents(differBy);
// 声明将原数据集按照DifferBy字段聚合之后的多组数据集
List<List<Table>> data_List_WithGroups = new List<List<Table>>();
// 进行分组
foreach (var fieldValue in differ_List)
{
// 分组依据(委托函数)
Func<Table, bool> whereFunc =
delegate(Table table)
{
var value = typeof(Table).GetProperty(differBy).GetValue(table, null);
return value.ToString().Equals(fieldValue);
};
List<Table> sameFieldValue_List = data_List.Where(whereFunc).ToList();
data_List_WithGroups.Add(sameFieldValue_List);
}
return data_List_WithGroups;
}
}
}
二、对RadChartView扩展
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Telerik.WinControls.UI;
using System.Reflection;
using Telerik.Charting;
using BNTU.Extensions;
using System.Drawing;
namespace BNTU.Extensions.Telerik
{
public static class RadChartViewExtensions
{
public static void LoadBarChart<Table>(this RadChartView radChartView, List<Table> data_List, string xAxisName, string yAxisName, string differBy, CategoricalAxis horizontalAxis = null, LinearAxis verticalAxis = null)
{
List<List<Table>> data_List_WithGroups = data_List.DifferBy(differBy);
foreach (var data_List_Group in data_List_WithGroups)
{
radChartView.LoadBarChart(data_List_Group, xAxisName, yAxisName);
}
radChartView.SetAxis();
}
public static void LoadBarChart<Table>(this RadChartView radChartView, List<Table> data_List, string xAxisName, string yAxisName)
{
BarSeries barSeries = new BarSeries();//定义一个柱状图集合
barSeries.ShowLabels = true;//显示值数据
foreach (var data in data_List)
{
var category = typeof(Table).GetProperty(xAxisName).GetValue(data, null);
double value = double.Parse(typeof(Table).GetProperty(yAxisName).GetValue(data, null).ToString());
barSeries.DataPoints.Add(new CategoricalDataPoint(value, category));
}
radChartView.Series.Add(barSeries);//添加柱状图集合
}
public static void SetAxis(this RadChartView radChartView, CategoricalAxis horizontalAxis = null, LinearAxis verticalAxis = null)
{
BarSeries barSeries = radChartView.Series.FirstOrDefault() as BarSeries;
#region 添加垂直Y轴信息
LinearAxis linearAxis = barSeries.VerticalAxis as LinearAxis;
if (verticalAxis == null)
{
linearAxis.CustomFont = "Times New Roman";
linearAxis.CustomFontSize = 10f;
linearAxis.MajorStep = 20f;
}
else
{
linearAxis.CustomFont = verticalAxis.CustomFont;
linearAxis.CustomFontSize = verticalAxis.CustomFontSize;
linearAxis.MajorStep = verticalAxis.MajorStep;
}
#endregion
#region 添加水平X轴信息
CategoricalAxis categoricalAxis = barSeries.HorizontalAxis as CategoricalAxis;
if (horizontalAxis == null)
{
categoricalAxis.LabelFitMode = AxisLabelFitMode.Rotate;
categoricalAxis.GapLength = 1.0 / radChartView.Series.Count;
categoricalAxis.CustomFont = "Times New Roman";
categoricalAxis.CustomFontSize = 10f;
categoricalAxis.BorderColor = Color.FromArgb(209, 209, 209);
}
else
{
categoricalAxis.LabelFitMode = horizontalAxis.LabelFitMode;
categoricalAxis.GapLength = horizontalAxis.GapLength;
categoricalAxis.CustomFont = horizontalAxis.CustomFont;
categoricalAxis.CustomFontSize = horizontalAxis.CustomFontSize;
categoricalAxis.BorderColor = horizontalAxis.BorderColor;
}
#endregion
}
}
}
三、设置图表样式以及构造实体对象模型
这一部分与Telerik入门—简单柱状图绘制一致,不做改变。
四、使用LoadBarChart绘图
1. 加载数据
private List<Student> GetData()
{
List<Student> student_List = new List<Student>();
student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 89, Time = "2018-1" });
student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 65, Time = "2018-2" });
student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 85, Time = "2018-3" });
student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 93, Time = "2019-1" });
student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 92, Time = "2019-2" });
student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 75, Time = "2019-3" });
student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 96, Time = "2020-1" });
student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 78, Time = "2020-2" });
student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 99, Time = "2020-3" });
student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 69, Time = "2018-1" });
student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 79, Time = "2018-2" });
student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 76, Time = "2018-3" });
student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 95, Time = "2019-1" });
student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 88, Time = "2019-2" });
student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 89, Time = "2019-3" });
student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 95, Time = "2020-1" });
student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 93, Time = "2020-2" });
student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 82, Time = "2020-3" });
student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 56, Time = "2018-1" });
student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 50, Time = "2018-2" });
student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 50, Time = "2018-3" });
student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 51, Time = "2019-1" });
student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 52, Time = "2019-2" });
student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 44, Time = "2019-3" });
student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 47, Time = "2020-1" });
student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 52, Time = "2020-2" });
student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 42, Time = "2020-3" });
return student_List;
}
2. 在Form1的构造函数中调用
// 加载柱状图
this.radChartView1.LoadBarChart(GetData(), "Time", "Score", "StudentName");
五、项目代码
百度网盘地址;提取码:cvn4;