0

我有一个带有两个图的图表。一张图显示 10 个数据点并且是静态的。第二个图应该只显示一个作为滑块选择函数的数据点。

但是,每当我移动滑块来计算单个数据点的坐标时,绘图都会生成一系列点,直到我停止滑动。我想删除这串点,只显示滑块停止位置所代表的点。希望这是有道理的。

这是图表的样子(错误地):

哎呀,我太新了,无法发布图片,但我相信你明白了。

这是滑块 IBAction 中的部分代码:

CPTScatterPlot *dotPlot = [[[CPTScatterPlot alloc] init] autorelease];
dotPlot.identifier = @"Blue Plot";
dotPlot.dataSource = self;
dotPlot.dataLineStyle = nil;
[graph addPlot:dotPlot];

NSMutableArray *dotArray = [NSMutableArray arrayWithCapacity:1];
NSNumber *xx = [NSNumber numberWithFloat:[estMonthNumber.text floatValue]];
NSNumber *yy = [NSNumber numberWithFloat:[estMonthYield.text floatValue]];
[dotArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:xx,@"x",yy,@"y", nil]];

CPTMutableLineStyle *dotLineStyle = [CPTMutableLineStyle lineStyle];
dotLineStyle.lineColor = [CPTColor blueColor];
CPTPlotSymbol *yieldSymbol = [CPTPlotSymbol ellipsePlotSymbol];
yieldSymbol.fill = [CPTFill fillWithColor:[CPTColor blueColor]];
yieldSymbol.size = CGSizeMake(10.0, 10.0);
dotPlot.plotSymbol = yieldSymbol;

self.dataForPlot = dotArray;

我尝试使用 [dotPlot reloadData] 重新加载绘图,甚至尝试删除并重新添加 dotPlot,但似乎都不起作用,或者,也许我将说明放在错误的位置或错误的顺序。

任何建议将不胜感激。

4

2 回答 2

1

为什么要在滑块操作中重新创建散点图?在该方法中,您唯一需要做的就是更新为第二个绘图提供数据的数组,然后调用 reloadData。

无论如何,您获得线索的原因是您不断创建新图并将它们添加到图表中。应该在滑块方法中的唯一代码是:

NSMutableArray *dotArray = [NSMutableArray arrayWithCapacity:1];
NSNumber *xx = [NSNumber numberWithFloat:[estMonthNumber.text floatValue]];
NSNumber *yy = [NSNumber numberWithFloat:[estMonthYield.text floatValue]];
[dotArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:xx,@"x",yy,@"y", nil]];
self.dataForPlot = dotArray;

[graph reloadData];
于 2011-09-26T20:42:44.370 回答
1

我想我离解决方案只有一行代码。通常情况下,我梦想着解决方案。首先,我从滑块方法中删除了所有 NSMutableArray *dotArray 等代码。其次,我按照 Flyingdiver 的建议在滑块方法中保留了 [graph reloadData]。第三,我修改了数据源方法如下:

#pragma mark - Plot datasource methods
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
    return [dataForPlot count];
}
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:     (NSUInteger)index { 
    NSNumber *num = [[dataForPlot objectAtIndex:index] valueForKey:(fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y")];
    // Blue dot gets placed above the red actual yields
    if ([(NSString *)plot.identifier isEqualToString:@"Blue Plot"]) {
        if (fieldEnum == CPTScatterPlotFieldX) {
            num = [NSNumber numberWithFloat:[estMonthNumber.text floatValue]]; }
        if (fieldEnum == CPTScatterPlotFieldY) {
        num = [NSNumber numberWithFloat:[estMonthYield.text floatValue]]; }
    }
    return num;
}

再次感谢 Flyingdiver 提供的解开我谜团的线索一百万。我学到了很多。

于 2011-09-27T15:15:29.310 回答