Ipad 散点图中的新数据未显示在边界中

Ipad 散点图中的新数据未显示在边界中,ipad,core-plot,Ipad,Core Plot,我在iPad应用程序中使用coreplot库0.9。 这里,我使用具有固定y范围的散点图(在y方向上没有滚动),即绘图空间范围=全局范围(参见下面的源代码)。 当新数据可用时(MOC观测),我将数据添加到绘图的数据数组(散点图),确定所需的新y范围(数据数组中的最小/最大值),并重新加载整个绘图。 如果新数据的值大于其他值,则尽管绘图空间已适应新范围,但绘图显示超出范围 但是: 如果MOC更改不是由于插入新数据(大于旧数据),而是由于删除数据(在绘图数据数组中具有最大值),则结果是完美的:绘图使

我在iPad应用程序中使用coreplot库0.9。
这里,我使用具有固定y范围的散点图(在y方向上没有滚动),即绘图空间范围=全局范围(参见下面的源代码)。
当新数据可用时(MOC观测),我将数据添加到绘图的数据数组(散点图),确定所需的新y范围(数据数组中的最小/最大值),并重新加载整个绘图。
如果新数据的值大于其他值,则尽管绘图空间已适应新范围,但绘图显示超出范围

但是:
如果MOC更改不是由于插入新数据(大于旧数据),而是由于删除数据(在绘图数据数组中具有最大值),则结果是完美的:绘图使用全范围-->范围自适应(减小绘图空间范围)。为什么这在另一个方向(增加绘图空间范围)也不起作用

我真的被困在这里,如果有人能帮我,我会很高兴的。谢谢

-(void) mocChangeNotification:(NSNotification *)notification
{
    ...
    [self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO];  
}

- (void) setYAxisValueRange
{
    ...
    myOwnPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(minDisplay)
                                                         length:CPTDecimalFromFloat(maxDisplay)];
    // disable "scrolling" in y-direction
    myOwnPlotSpace.globalYRange = myOwnPlotSpace.yRange;
}

- (void) refresh
{
    [dataForPlot removeAllObjects];
    [self preparePlotData]; // put data into plot's data array
    [self setYAxisValueRange]; // looks for min / max values in data
    [myPlot reloadData];
}
这些屏幕截图显示了这种情况(因为我不熟悉堆栈溢出,所以还不允许发布图片):

1) 绘图的初始显示(一切正常):
文件:截图\图形\首字母

2) 我将新值(200)添加到绘图-->显示超出界限(上限)
文件:屏幕截图\u图形\u添加200

3) 我从绘图中删除值200和150-->绘图显示完全自适应
文件:截图\图形\删除150

4) 我将新值(40)添加到绘图-->显示越界(下限)

文件:屏幕截图\u图形\u添加40

绘图范围具有起始位置和长度。你的位置还可以;使用
maxDisplay-minDisplay
作为长度

确保绘图使用要更新的绘图空间:

[graph addPlot:myPlot toPlotSpace:myOwnPlotSpace];

最终,我找到了这种行为的原因和解决方法:
我从方法“setYAxisValueRange”中删除了这一行:

在启动时将globalYRange设置为当前y范围可防止图形在以后更改当前范围和globalYRange时正确更新其显示。它似乎在内部存储globalYRange的初始值,直到时间结束。
我不知道这是CorePlot中的一个bug,还是我对它的用法缺乏了解。
不管怎样,修复对我来说都很好。无论如何,我不需要设置globalYRange,因为我通过委托方法“plotSpace:willChangePlotRangeTo:forCoordinate:”阻止了绘图的垂直滚动

我希望我的回答对任何陷入同一困境的人都有帮助。

如果有人对这个问题有更详细的解释,我很想读一读。

谢谢你,埃里克,帮我指出了这一点。这实际上是我的代码中的一个bug(导致绘图区域太大)。但即使有了这个解决方案,问题依然存在。我将添加演示该问题的屏幕截图链接。一旦我有必要的特权,我将投票支持你的答案。如果我满意地回答了你的问题,你可以“接受”答案。这是故意的。对绘图空间
yRange
的任何更改都将限制在
globalYRange
中。为了避免这种情况,请在更改
yRange
之前将
globalYRange
设置为nil,然后将其重置。
xRange
globalXRange
的行为方式相同。感谢您的解释。我会记住这一点,以便将来发展。
myOwnPlotSpace.globalYRange = myOwnPlotSpace.yRange;