官网资料:Chart 类 (System.Windows.Forms.DataVisualization.Charting) | Microsoft Learn
类的 Chart 两个重要属性是 Series 和 ChartAreas 属性,这两个属性都是集合属性。 Series集合属性存储Series对象,这些对象用于存储要显示的数据以及该数据的属性。 ChartAreas集合属性存储ChartArea对象,这些对象主要用于使用一组轴绘制一个或多个图表。
图标中集合的作用
主要包含:Annotations(获取并设置存储图标注释的集合)、ChartAreas(获取用于存储 ChartAreaCollection 对象的只读 ChartArea 对象)、Legends(获取或设置LegendCollection, 其存储所有用于 Legend 控件的 Chart 对象)、Series(显示数据获取一个 SeriesCollection 对象,该对象包含 Series 对象)、Titles
遇到的bug
- 将数据绑定在chart数据源上,更改DataCount,就更改了数据源。
int DataCount = 0;
chart1.Series[0].Points.DataBindY(DataPanel[DataCount]);
- 给chart控件添加滚动条
private void ChartScrollbarStyle()
{
chartAmend.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
chartAmend.ChartAreas[0].AxisX.ScaleView.Position = 1;
chartAmend.ChartAreas[0].AxisX.ScaleView.Size = 300;
chartAmend.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll;
chartAmend.ChartAreas[0].AxisX.ScrollBar.ButtonColor = Color.Silver;
chartAmend.ChartAreas[0].AxisX.ScrollBar.LineColor = Color.Black;
chartAmend.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false;
}
- X轴显示为时间
- 设置数据类型为Time
- 数据添加时,X是时间
string time = DateTime.Now.ToString("HH:mm:ss:fff"); // 获取时间,yyyy-MM-dd HH:mm:ss:ffff
chart1.Series[x].Points.AddXY(time, data.Y); // 添加显示数据
- 界面中显示添加数据y值
- 在添加数的函数值中设置显示属性为true
chart1.Series[0].IsValueShownAsLabel = true;
- 绘制直线用于指引最大值,最小值等
// 如果interval不设置为0,则y轴间隔这个数值会有一条线,设置为0后则只有offset的一条线
ChartArea chartArea = chart.ChartAreas[0];
StripLine stripLine = new StripLine();
stripLine.Interval = 0; // 例如,你想在Y=50的位置画线
stripLine.IntervalOffset = 11;
stripLine.StripWidth = 0.15; // 设置宽度为很小的值以模拟直线
stripLine.Text = name;
stripLine.BackColor = Color.Red; // 设置线的颜色
chartArea.AxisY.StripLines.Add(stripLine);
应用完整代码
/// <summary>
/// 添加显示最大值、最小值、平均值
/// </summary>
/// <param name="chart"></param>
/// <param name="series"></param>
/// <param name="showMax"></param>
/// <param name="showMin"></param>
/// <param name="showAverage"></param>
void SetupChartStripLine(Chart chart, Series series, bool showMax = true, bool showMin = true, bool showAverage = true)
{
if (chart == null || series == null)
return;
double maxValue = series.Points.FindMaxByValue().YValues[0];
double minValue = series.Points.FindMinByValue().YValues[0];
double sum = 0;
foreach (var point in series.Points)
{
sum += point.YValues[0];
}
double averageValue = sum / series.Points.Count;
// 定义一个 Action<string> 委托,它引用了一个接受字符串参数的方法
Action<string, double> myAction = (name, value) =>
{
ChartArea chartArea = chart.ChartAreas[0];
StripLine stripLine = new StripLine();
stripLine.Interval = 0; // 例如,你想在Y=50的位置画线
stripLine.IntervalOffset = value;
stripLine.StripWidth = 0.08; // 设置宽度为很小的值以模拟直线
stripLine.BackColor = Color.Red; // 设置线的颜色
stripLine.Text = name;
chartArea.AxisY.StripLines.Add(stripLine);
};
// 调用传入的 Action<string> 委托,并传入一个字符串参数
if (showMax)
myAction?.Invoke("最大值:" + maxValue, maxValue); // 使用?.是为了避免在action为null时引发异常
if (showMin)
myAction?.Invoke("最小值:" + minValue, minValue);
if (showAverage)
myAction?.Invoke("平均值:" + averageValue, averageValue);
}
运行效果