您的位置:

掌握ChartControl:多角度解析

一、ChartControl是什么?

ChartControl是DevExpress公司推出的一种数据可视化工具,它使用C#和Visual Basic.NET编写,可用于创建高级图表、3D图表、实时图表、仪表板、地图和Gantt图表等数据展示效果。

ChartControl可用于WinForms、ASP.NET、WPF和Silverlight多个平台,图表类型包括面积图、条形图、折线图、气泡图、甘特图、数据点图、散点图、饼图和雷达图等多种类型,让用户能够轻松地呈现和分析大数据。

二、ChartControl的基本使用

ChartControl的基础使用非常简单,只需要创建一个ChartControl实例并设置属性即可:

ChartControl chartControl = new ChartControl();
chartControl.Title.Text = "销售数据";
Series series = new Series("数据", ViewType.Line);
series.Points.Add(new SeriesPoint("一月", 100));
series.Points.Add(new SeriesPoint("二月", 200));
series.Points.Add(new SeriesPoint("三月", 300));
chartControl.Series.Add(series);

代码解释:

1. 创建一个ChartControl实例。

2. 设置图表标题为“销售数据”。

3. 创建一个名为“数据”的系列,类型为折线图。

4. 向系列中添加三个数据点。

5. 将系列添加到图表中。

这样,一个简单的折线图就创建完成了。

三、ChartControl的高级使用

1、自定义图表样式

ChartControl提供了多种自定义图表样式的方法,包括为整个图表设置主题、更改系列线条颜色、添加数据标签等等。

以下代码演示为一个面积图添加图例:

ChartControl chartControl = new ChartControl();
chartControl.SeriesTemplate.ChangeView(ViewType.Area);
chartControl.DataSource = CreateData();
chartControl.SeriesDataMember = "Country";
chartControl.SeriesTemplate.ArgumentDataMember = "Year";
chartControl.SeriesTemplate.ValueDataMembers.AddRange(new string[] { "Population" });
((AreaSeriesView)chartControl.SeriesTemplate.View).AxisY.Label.TextPattern = "{V:###,###,###,##0,,M}";
((AreaSeriesView)chartControl.SeriesTemplate.View).AreaOpacity = 180;
((XYDiagram)chartControl.Diagram).AxisX.Label.Angle = 45;
Legend legend = new Legend();
chartControl.Legend = legend;
legend.AlignmentHorizontal = LegendAlignmentHorizontal.Right;
legend.AlignmentVertical = LegendAlignmentVertical.Top;

代码解释:

1. 创建一个ChartControl实例。

2. 设置图表类型为面积图。

3. 设置数据源。

4. 设置系列数据成员为“Country”。

5. 设置类别数据成员为“Year”。

6. 设置值数据成员为“Population”。

7. 设置Y轴标签格式为以百万为单位,格式为“###,###,###,##0,,M”。

8. 设置面积透明度为180。

9. 设置X轴标签旋转角度为45度。

10. 创建一个图例实例。

11. 将图例实例添加到图表中。

12. 设置图例位置为右上方。

2、交互式图表

ChartControl提供了多种交互式图表的功能,包括鼠标悬停提示、点选系列和数据点、缩放和平移等,让用户能够方便地查看和分析数据。

以下代码演示为一个折线图添加鼠标悬停提示和点选系列功能:

ChartControl chartControl = new ChartControl();
chartControl.SeriesTemplate.ChangeView(ViewType.Line);
chartControl.ToolTipOptions.ToolTipPosition = ToolTipPosition.MousePoint;
chartControl.ToolTipOptions.ShowForSeries = true;
chartControl.ToolTipOptions.ShowForPoints = true;
chartControl.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;

Series series1 = new Series("Series 1", ViewType.Line);
series1.Points.Add(new SeriesPoint("A", 1));
series1.Points.Add(new SeriesPoint("B", 2));
series1.Points.Add(new SeriesPoint("C", 3));
series1.Points.Add(new SeriesPoint("D", 4));
chartControl.Series.Add(series1);

Series series2 = new Series("Series 2", ViewType.Line);
series2.Points.Add(new SeriesPoint("A", 10));
series2.Points.Add(new SeriesPoint("B", 20));
series2.Points.Add(new SeriesPoint("C", 30));
series2.Points.Add(new SeriesPoint("D", 40));
chartControl.Series.Add(series2);

chartControl.MouseUp += (s, e) =>
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        ChartHitInfo hitInfo = chartControl.CalcHitInfo(e.Location);
        if (hitInfo.Series != null)
        {
            if (hitInfo.Series.Visible)
                hitInfo.Series.Visible = false;
            else
                hitInfo.Series.Visible = true;
        }
    }
};

代码解释:

1. 创建一个ChartControl实例。

2. 设置图表类型为折线图。

3. 设置鼠标悬停提示的位置为鼠标指针所在位置。

4. 同时为系列和数据点显示鼠标悬停提示。

5. 设置图例不可见。

6. 创建两个名为“Series 1”和“Series 2”的系列,类型为折线图,分别添加四个数据点。

7. 将两个系列添加到图表中。

8. 为ChartControl的MouseUp事件添加事件处理程序,通过判断鼠标指针的左键单击事件,实现点选系列的功能。

四、ChartControl的实窗口应用

ChartControl非常适合用于实时数据的展示和分析,在实时数据监测和控制系统、实时交易系统和实时监控系统等领域都有广泛应用。

以下代码演示如何在WinForms中创建一个示例程序,用于实时监控股票价格:

public partial class MainForm : Form
{
    private readonly Random _random = new Random();
    private readonly Timer _timer = new Timer();
    private readonly ChartControl _chartControl = new ChartControl();

    public MainForm()
    {
        InitializeComponent();

        _chartControl.Dock = DockStyle.Fill;
        _chartControl.SeriesTemplate.ChangeView(ViewType.CandleStick);
        _chartControl.DataSource = CreateData(TimeSpan.FromMilliseconds(500));
        _chartControl.SeriesDataMember = "Symbol";
        _chartControl.SeriesTemplate.ArgumentDataMember = "DateTime";
        _chartControl.SeriesTemplate.ValueDataMembers.AddRange(new string[] { "Open", "High", "Low", "Close" });
        ((CandleStickSeriesView)_chartControl.SeriesTemplate.View).AxisX.Label.Angle = 45;
        ((CandleStickSeriesView)_chartControl.SeriesTemplate.View).ColorEach = true;
        _timer.Interval = 500;
        _timer.Tick += Timer_Tick;
        _timer.Start();

        Controls.Add(_chartControl);
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        foreach (Series series in _chartControl.Series)
        {
            if (series.Visible)
            {
                for (int i = 0; i < series.Points.Count; i++)
                {
                    if (series.Points[i].Values.Length == 4)
                    {
                        double rand = _random.NextDouble() * 0.5 + 0.5;
                        double nextValue = series.Points[i].Values[3] * rand;
                        series.Points[i].Values[0] = nextValue - 1;
                        series.Points[i].Values[1] = nextValue + 1;
                        series.Points[i].Values[2] = nextValue - 0.5;
                        series.Points[i].Values[3] = nextValue + 0.5;
                    }
                }
            }
        }
    }

    private DataTable CreateData(TimeSpan timeSpan)
    {
        DataTable dataTable = new DataTable();
        dataTable.Columns.Add("Symbol", typeof(string));
        dataTable.Columns.Add("DateTime", typeof(DateTime));
        dataTable.Columns.Add("Open", typeof(double));
        dataTable.Columns.Add("High", typeof(double));
        dataTable.Columns.Add("Low", typeof(double));
        dataTable.Columns.Add("Close", typeof(double));
        DateTime dateTime = DateTime.Now;
        foreach (string symbol in new string[] { "AAPL", "GOOG", "MSFT", "TSLA" })
        {
            for (int i = 0; i < 60; i++)
            {
                DataRow dataRow = dataTable.NewRow();
                dataRow["Symbol"] = symbol;
                dataRow["DateTime"] = dateTime + TimeSpan.FromSeconds(i * timeSpan.TotalSeconds);
                dataRow["Open"] = _random.NextDouble() * 10 + 90;
                dataRow["High"] = _random.NextDouble() * 10 + (double)dataRow["Open"];
                dataRow["Low"] = _random.NextDouble() * 10 + (double)dataRow["Open"];
                dataRow["Close"] = _random.NextDouble() * 10 + (double)dataRow["Open"];
                dataTable.Rows.Add(dataRow);
            }
        }
        return dataTable;
    }
}

代码解释:

1. 创建一个继承自Form的MainForm类。

2. 创建一个ChartControl实例,并设置为窗口的Dock样式为Fill。

3. 设置图表类型为K线图。

4. 设置数据源。

5. 设置系列数据成员为“Symbol”。

6. 设置类别数据成员为“DateTime”。

7. 设置值数据成员为“Open”、“High”、“Low”和“Close”。

8. 设置X轴标签旋转角度为45度。

9. 开启曲线颜色分别设置。

10. 创建一个定时器实例,并设置计时间隔为500ms。

11. 为定时器的Tick事件添加事件处理程序,实现动态更新数据点的功能。

12. 创建一个CreateData方法,用于生成示例数据。

13. 在MainForm类的构造函数中,设置ChartControl和Timer,并将ChartControl添加到窗口中。

结语

本文对ChartControl进行了全面的解析,从基础使用到高级应用,再到实际应用的示例展示,FashionAI希望读者们能够对ChartControl的使用有更全面、深入和实践性的了解。ChartControl的强大功能,不仅能够帮助用户轻松完成数据展示和分析的任务,同时也为需要处理大数据和复杂数据的业务场景提供了更佳的解决方案。