CorePlot 中的缩放轴

Posted

技术标签:

【中文标题】CorePlot 中的缩放轴【英文标题】:Zooming axes in CorePlot 【发布时间】:2011-02-18 17:28:22 【问题描述】:

我有一个使用 CorePlot 绘制图表的应用程序。我已经使用捏合手势实现了图形本身的缩放,但我仍然无法使轴附近的标签(包含 1、2 等数字)正确缩放,因此主要间隔不是 1,而是变为 5 或0.5(或任何其他数字)取决于捏合手势。

-(void) viewDidAppear
   
UIPinchGestureRecognizer* rec = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scalePiece:)];
// set options for this recognizer.
[self.view addGestureRecognizer:rec];

...
xMajorInterval = 1;
yMajorInterval = 1;

axisSet = (CPXYAxisSet *)graph.axisSet;

axisSet.xAxis.majorIntervalLength = CPDecimalFromFloat(xMajorInterval);
axisSet.xAxis.minorTicksPerInterval = 4;
axisSet.xAxis.minorTickLength = 4.0f;
axisSet.xAxis.majorTickLength = 8.0f;
axisSet.xAxis.labelOffset = 1.0f;

axisSet.yAxis.majorIntervalLength = CPDecimalFromFloat(yMajorInterval);
axisSet.yAxis.minorTicksPerInterval = 4;
axisSet.yAxis.minorTickLength = 4.0f;
axisSet.yAxis.majorTickLength = 8.0f;
axisSet.yAxis.labelOffset = 1.0f;




...




- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer 

//Here I tried to change xMajorInterval and yMajorInterval and redraw axes



这是我缩放绘图的方法

- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer 

if (PlotSpaceX > -0.1) 

if ([gestureRecognizer scale] > 1) 

    PlotSpaceY = PlotSpaceY - 0.1;
    PlotSpaceX = PlotSpaceX - 0.1;




if (PlotSpaceY >= -0.1) 
if ([gestureRecognizer scale] < 1)

    PlotSpaceY = PlotSpaceY + 0.1;
    PlotSpaceX = PlotSpaceX + 0.1;



plotSpace.xRange = [CPPlotRange plotRangeWithLocation:plotSpace.xRange.location length:CPDecimalFromFloat(PlotSpaceX * 2.0)];
plotSpace.yRange = [CPPlotRange plotRangeWithLocation:plotSpace.yRange.location length:CPDecimalFromFloat(PlotSpaceY * 2.0)];
majorInterval = majorInterval*PlotSpaceX/4;

intMajorInterval = majorInterval;
NSLog(@"%i", intMajorInterval);
axisSet.xAxis.majorIntervalLength = CPDecimalFromInt(intMajorInterval);
axisSet.yAxis.majorIntervalLength = CPDecimalFromInt(intMajorInterval);



在 scalePiece 方法中,我尝试更改 xMajorInterval 和 yMajorInterval 并重绘坐标轴,但不幸的是,此方法在捏合手势期间经常被调用,以至于标签只显示巨大的数字。

你能帮帮我吗?

【问题讨论】:

如何计算 majorIntervalLength 的新值? 这是我的问题 - 我应该如何更改 xMajorInterval 和 yMajorInterval 的值,以便标签显示正常的用户友好数字 【参考方案1】:

这个问题的答案似乎取决于您如何缩放图表本身。

您基本上希望以与缩放绘图空间范围相同的方式缩放majorIntervalLength。也就是说,如果您将范围扩大 2 倍,那么您还希望将 majorIntervalLength 的值更改为当前值的两倍。如果扩大 1.1,则将 majorIntervalLength 的当前值乘以 1.1,然后将 majorIntervalLength 设置为该新值。

如果您发布用于图形缩放的代码,我可以通过一些代码提供更详细的答案。

[更新] 看了你的代码后。我会推荐以下更改

在更新 PlotSpaceX 之前,请执行以下操作:

intervalScale = (PlotSpaceX + 0.1 / PlotSpaceX)

然后像这样更新majorInterval

majorInterval = majorInterval*intervalScale

这应该以与 x 坐标完全相同的方式缩放轴间隔。

【讨论】:

我已经编辑了问题并添加了代码。希望这已经足够了。每次调用 scalePiece: 时,我都尝试将 xMajorInterval 和 yMajorInterval 乘以 2,但是在 1 次捏合之后,这些值变得非常大。

以上是关于CorePlot 中的缩放轴的主要内容,如果未能解决你的问题,请参考以下文章

ios中的Coreplot构建失败问题

如何使用 iphone sdk 中的 corePlot 库将 CPTAxisLabel 包装成两行?

matlab中的GUI,轴中的图像循环

flex 容器中的项目溢出 x 轴中的父元素

CorePlot学习六---点击scatterPlot中的symbol点时弹出对应的凝视

在 Python 中的 X 轴中绘制多个布尔列