【问题标题】:new data in scatter plot not shown in bounds散点图中的新数据未显示在边界内
【发布时间】:2011-11-09 00:18:47
【问题描述】:

我在我的 iPad 应用程序中使用 coreplot library 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];
}

这些截图显示了情况(由于我是 Stack Overflow 的新手,我还不能发布图片):http://gallery.me.com/timoseeberger#100038&view=grid&bgcolor=black&sel=5

1) 初始显示情节(一切正常):
文件:screenshot_graph_initial

2) 我在绘图中添加新值 (200) --> 显示超出范围(上端)
文件:screenshot_graph_adding200

3) 我从绘图中删除值 200 和 150 --> 绘图显示完美适应
文件:screenshot_graph_deleting150

4) 我在绘图中添加新值 (40) --> 显示越界(下端)
文件:screenshot_graph_adding40

【问题讨论】:

    标签: ipad core-plot


    【解决方案1】:

    最终,我找到了该行为的原因以及如何解决它:
    我从方法“setYAxisValueRange”中删除了这一行:

    myOwnPlotSpace.globalYRange = myOwnPlotSpace.yRange;  
    

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

    希望我的回答对落入同一个坑的人有所帮助。
    如果有人对此问题有更详细的解释,我渴望阅读。

    【讨论】:

    • 这是设计使然。对绘图空间yRange 的任何更改都被限制为globalYRange。为避免这种情况,请在更改 yRange 之前将 globalYRange 设置为 nil,然后再将其重置。 xRangeglobalXRange 的行为方式相同。
    • 感谢您的解释。我会牢记这一点,以备将来发展。
    【解决方案2】:

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

    确保您的绘图使用您正在更新的绘图空间:

    [graph addPlot:myPlot toPlotSpace:myOwnPlotSpace];
    

    【讨论】:

    • 感谢 Eric 向我指出这一点。这实际上是我的代码中的一个错误(导致绘图区域太大)。但即使有了这个修复,问题仍然存在。我将添加指向演示问题的屏幕截图的链接。
    • 一旦我有必要的特权,我会投票给你的答案。
    • 如果我满意地回答了你的问题,你可以“接受”这个答案。
    猜你喜欢
    • 2021-09-02
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多