毕业设计需要设计可以实时显示数据曲线的上位机,于是学习了ZedGraph控件的使用,对用到的属性进行记录。
0、变量声明
ZedGraphControl zgc;
GraphPane panel = zgc.GraphPane;
PointPairList listAmp = new PointPairList();
LineItem cureAmp = panel.AddCurve("Amplitude", listAmp, Color.Red, SymbolType.Square);
- 1
- 2
- 3
- 4
1、设置字体样式时避免出现边框
会出现边框的写法:
FontSpec myFont = new FontSpec(“Arial”, 16, Color.Black, true, false, false);
panel.Title.FontSpec = myFont;
- 1
- 2
不会出现边框的写法:
panel.Title.FontSpec.Family = "Arial";
panel.Title.FontSpec.Size = 16;
panel.Title.FontSpec.IsBold = true;
- 1
- 2
- 3
2、鼠标拖动曲线图
第一种是按住shift键后拖动
zgc.PanModifierKeys = Keys.Shift;
- 1
第二种是直接鼠标拖动
zgc.PanModifierKeys = Keys.None;
- 1
3、曲线图上下左右移动控制
zgc.IsEnableHPan = false; // 鼠标拖动时禁止横向移动
zgc.IsEnableVPan = false; // 鼠标拖动时禁止纵向移动
- 1
- 2
4、设置缩放比例与鼠标滚轮步骤大小关系
zedGraphControl1.ZoomStepFraction = 0; // 比例为0,即禁用鼠标滚轮的缩放功能
zedGraphControl1.ZoomStepFraction = 0.1; // 比例越大,缩放越灵敏
- 1
- 2
5、禁用右键菜单
右键菜单还挺好用的,我没有禁用过。
zgc.IsShowContextMenu = false;
- 1
6、不显示上方x轴
其中MajorTic指大刻度,MinorTic指小刻度。
zgc.GraphPane.XAxis.MajorTic.IsOpposite = false;
zgc.GraphPane.XAxis.MinorTic.IsOpposite = false;
- 1
- 2
7、显示网格并设置网格线参数
zgc.GraphPane.XAxis.MajorGrid.IsVisible = true; // 显示大刻度对应的网格
zgc.GraphPane.XAxis.MinorGrid.IsVisible = true; // 显示小刻度对应的网格
panel.XAxis.MajorGrid.DashOn = 5f; // 网格为虚线,这句话是设置虚线中的实线部分长度
panel.XAxis.MajorGrid.DashOff = 2f; // 设置虚线中的空白部分长度
panel.XAxis.MajorGrid.PenWidth = 1.5f; // 设置虚线线宽
- 1
- 2
- 3
- 4
- 5
- 6
8、横纵轴缩放控制
zgc.IsEnableVZoom = false; // 纵轴不缩放,默认为true,即可缩放
zgc.IsEnableHZoom = false; // 横轴不缩放
- 1
- 2
9、纵轴刻度的十次幂显示控制
当放大得很大时,纵轴刻度会用十次幂表示。但是我赋值false后仍然显示十次幂,这个我暂时没有找到原因。
zgc.GraphPane.YAxis.Scale.IsUseTenPower = false; // 不用十次幂
- 1
10、刻度线显示控制
以左边的纵坐标轴为例。画一根竖直的线,再画一根水平的线。outside指的是位于竖线左边的横线,inside指位于竖线右边的横线,但是crossinside和crossoutside是什么我还没想明白。我习惯把大刻度的crossinside和crossoutside都关了,把小刻度的outside和inside都关了。这样刻度线看起来比较清爽。
panel.YAxis.MajorTic.IsCrossInside = false;
panel.YAxis.MajorTic.IsCrossOutside = false;
panel.YAxis.MinorTic.IsInside = false;
panel.YAxis.MinorTic.IsOutside = false;
- 1
- 2
- 3
- 4
11、坐标轴起点
这个设置的作用就是当你放大坐标轴,比如x轴,最小的刻度是BaseTic,刻度左边是没有刻度值的了,并不是说这个刻度是图像的最左边。
panel.XAxis.Scale.BaseTic = 0; // 横坐标轴的起点从零开始
- 1
12、大小刻度步长设置
大刻度是100一个单位,小刻度是20一个单位,这样的话相邻两根大刻度线之间有4根小刻度线。
panel.XAxis.Scale.MinorStep = 20;
panel.XAxis.Scale.MajorStep = 100;
- 1
- 2
13、最大最小刻度设置
很多情况下并不知道最大刻度应该是多少。所以可以选择自动匹配。还有一个MaxGrace,不知道跟Max的区别是什么。
panel.YAxis.Scale.Max = 3100;
panel.YAxis.Scale.Min = 0;
panel.YAxis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴的最大值
- 1
- 2
- 3
14、除数据区域外的图填充
panel.Fill = new Fill(Color.White, Color.LightGray, 45.0f); // 从左上角45.0°开始,从白色过渡到浅灰色
- 1
15、鼠标移动到曲线上某个数据点时显示数据点的坐标
zgc.IsShowPointValues = true;
- 1
16、鼠标移动到曲线上任何位置时显示该位置的坐标
zgc.IsShowCursorValues = true;
- 1
17、显示滚动条
区域放大后可以用滚动条浏览其他区域的数据。但是滚动条只能拉动一次,拉一次后就消失了,暂时没有找到原因。
zgc.IsShowHScrollBar = true;
zgc.IsShowVScrollBar = true;
- 1
- 2
18、以鼠标所在位置为中心进行放大
默认是以图形中心进行放大。
zgc.IsZoomOnMouseCenter = true;
- 1
19、修改曲线图例位置
panel.Legend.Position = ZedGraph.LegendPos.Top;
- 1
20、修改曲线图例字体
panel.Legend.FontSpec.Family = "Arial";
panel.Legend.FontSpec.Size = 14;
- 1
- 2
21、修改曲线粗细
cureAmp.Line.Width = 1.5f;
- 1
22、填充曲线数据点的图形
cureAmp.Symbol.Fill = new Fill(Color.Red);
- 1
23、关联曲线到纵坐标轴
当两条曲线各自使用不同刻度的纵坐标轴时,需要把曲线跟相应的坐标轴关联起来。
cureAmp.IsY2Axis = true; // 关联cureAmp曲线到右边的纵坐标轴
- 1
24、随机生成曲线点集
Random t = new Random();
for (int i = 0; i < 360; i += 10)
{
double x = i;
double y = t.NextDouble() * 1000;
double y2 = t.NextDouble() * 80 + 5;
listAmp.Add(x, y);
listFreq.Add(x, y2);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
25、动态添加曲线点
zgcAmpFreq.AxisChange(); // 因为点增加,需要自动修改横轴最大值(前提是MaxAuto为true),所以需要更新坐标轴。
Refresh(); // 把变化后的点集显示在图里
- 1
- 2
小点
1、我在关闭某个通道后重新打开,发现原本是0-3000的纵坐标变成了2000-3000的纵坐标(我的测试数据是2300),也就是纵坐标的最小值变了。于是我把最小值设置成0(原本没有设置)、把纵坐标轴的MinAtuo和MaxAuto都关了。这样的话关闭后打开某个通道,该通道对应的坐标轴的范围不变。
不懂的点
1、不知道这个是干嘛的。运行后也没看出来是什么意思。YAxis和Y2Axis只能用AlignP,不能用AlignV或者AlignH。
panel.YAxis.Scale.Align = AlignP.Outside;
panel.Y2Axis.Scale.Align = AlignP.Outside;
- 1
- 2
2、测试时,这句话加上后(true和false)并没有产生什么改变。
panel.Legend.Border.IsVisible = false;
- 1