Core-Plot:在Scatterplot中仅绘制一个点?

时间:2011-09-26 19:43:05

标签: core-plot scatter-plot

我有一张带有两个图的图表。一个图显示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但似乎既不起作用,也许我将指令放在错误的位置或错误的序列。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:1)

我认为我离解决方案很远。通常情况下,我梦想着解决方案。首先,我从slider方法中删除了所有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;
}

再一次,感谢飞行员花了一百万寻找解开我神秘面纱的线索。我学到了很多东西。