oxyPlot中PlotType= Cartesian 坐标轴调整方案

533 阅读1分钟

坐标轴调整方案

对于默认的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轴的实际坐标比例必须保持一致,且图标原点必须在左下角位置。因此必须将PlotModelPlotType属性设置成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);
}