坐标轴调整方案
对于默认的PlotModel,可以直接使用Maximum来调整坐标轴范围。
var axis = model.GetAxis("x");
if (axis is LinearAxis)
{
axis.Maximum = 0;
axis.Minimum = maxX;
axis.MaximumPadding = 1;
axis.MinimumPadding = 1;
}
axis = model.GetAxis("y");
if (axis is LinearAxis)
{
axis.Maximum = 0;
axis.Minimum = maxY;
axis.MaximumPadding = 1;
axis.MinimumPadding = 1;
}
最近有个需求,要求绘图的时候x和y轴的实际坐标比例必须保持一致,且图标原点必须在左下角位置。因此必须将PlotModel的PlotType属性设置成Cartesian。
可这样做会导致之前调整方案就没用了,因为x和y轴的刻度(Scale)必须时刻保持一致,这意味着指定X轴的范围后,Y轴的范围就已经确定下来了,可惜oxyPlot并没有自动计算坐标轴范围的功能,只能自己计算Y轴范围,然后通过Zoom指定。
解决思路:
double maxX = 400;
var axisX = model.GetAxis("x");
var axisY = model.GetAxis("y");
if (axisX is LinearAxis)
{
axisX.Zoom(0, maxX);
// 刷新图表以更新 X 轴范围
model.InvalidatePlot(true);
// 2. 获取表格的实际绘制范围
double screenMinX = axisX.ScreenMin.X; // X 轴屏幕左边界
double screenMaxX = axisX.ScreenMax.X; // X 轴屏幕右边界
// 计算实际表格显示的范围
double actualMinX = axisX.InverseTransform(screenMinX);
double actualMaxX = axisX.InverseTransform(screenMaxX);
// 3. 根据实际范围反推 Y 轴的最大值
double dataAspectRatio = axisX.ScreenMax.X / axisY.ScreenMax.Y;
double maxY = (actualMaxX - actualMinX) / dataAspectRatio;
// 4. 调整 Y 轴范围
axisY.Zoom(0, maxY);
model.InvalidatePlot(true);
}