核心图:将两个y轴对齐以具有相同的零点

时间:2013-01-23 14:31:03

标签: ios objective-c cocoa-touch core-plot

我的Core Plot项目中有第二个y - 轴(y2),我已按照以下代码中的说明进行设置。

如何让两个y轴具有相同的零点?目前,每个轴的零点处于不同的高度(在下面的屏幕截图中,y - 轴'零点等于y2 - 值为8.8%)。如何让Core Plot绘制两个轴在相同高度的零点?

我的代码:

CPTXYAxis *y = axisSet.yAxis;
y.coordinate = CPTCoordinateY;
y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(xAxisStart);
y.axisLineStyle = axisLineStyle;
y.majorIntervalLength = CPTDecimalFromInt(1);
y.majorTickLength = 5;
y.minorTickLength = 0;
y.majorGridLineStyle = axisLineStyle;

CPTXYPlotSpace *relativePlotSpace = [[CPTXYPlotSpace alloc] init];
[graph addPlotSpace:relativePlotSpace];

CPTXYAxis *y2 = [[CPTXYAxis alloc] init];
y2.axisLineStyle                = axisLineStyle;
y2.coordinate                   = CPTCoordinateY;
y2.orthogonalCoordinateDecimal  = CPTDecimalFromDouble(xAxisLength);
y2.plotSpace                    = relativePlotSpace;
y2.separateLayers               = NO;
y2.majorTickLineStyle           = axisLineStyle;
y2.minorTicksPerInterval        = 1;
y2.preferredNumberOfMajorTicks  = 8;
y2.labelingPolicy               = CPTAxisLabelingPolicyEqualDivisions;
graph.axisSet.axes = [NSArray arrayWithObjects:x, y, y2, nil];

enter image description here

修改

根据Eric在下面给出的答案,我添加了以下代码片段来计算y2轴的范围,该范围应该将其零点与y轴的零点对齐:

double yAxisAbsoluteLength = 
   ABS(plotSpace.yRange.lengthDouble);
double y2AxisAbsoluteLength = 
   (ABS(relativePlotSpace.yRange.lengthDouble) +
   ABS(relativePlotSpace.yRange.locationDouble));
double yAxisZeroPointToLengthRatio = 
   plotSpace.yRange.locationDouble / 
   yAxisAbsoluteLength;
double y2AxisLocation = yAxisZeroPointToLengthRatio
    *y2AxisAbsoluteLength;
relativePlotSpace.yRange = [CPTPlotRange
   plotRangeWithLocation:CPTDecimalFromDouble(y2AxisLocation)
   length:CPTDecimalFromDouble(y2AxisAbsoluteLength)];

如果y - 值为> 0,这似乎工作正常。但是,对于y - 值< 0y2位置也会拖到零点以下,这会导致计算出的y2AxisAbsoluteLength值不再足够的问题补偿拖动y2位置低于零点(y2点,高值被切断或未绘制在图表中)。我的解决方案只是将y2位置的绝对值添加到y2AxisAbsoluteLength值,但这会扭曲两个零点(yy2的对齐方式)。

如何更正我的计算以正确计算正面和负面y - 值? 在这种情况下,我无法使用expandRangeByFactor,因为在编码时乘法因子是未知的。

enter image description here

1 个答案:

答案 0 :(得分:1)

两个轴都会拉伸绘图区域的整个高度,因此您可以计算一些比率以确定第二个轴的范围。

示例:

绘图范围1:位置-100,长度400

这意味着零点位于距离范围位置25%(100/400)的点上。如果第二个绘图范围的长度为20,则会给它一个-5的位置,将长度的25%放在零点以下。