1

我试图在 ios 上用 core-plot 绘制一个甜甜圈饼图,一个图表在另一个图表中。每个切片具有相同的宽度,但切片是彩色编码的。我试图在每个切片的中心放置一个彩色点,但我不知道如何让点的位置正确。

我已经设法使用饼图的 labelOffset 属性使它们大致居中。(目前我使用 -35 的标签偏移量,由反复试验确定)。但是我无法让它们完全居中,并且在最里面的图中,它们最终可能会离得足够远,以至于它们位于错误的切片中。我尝试设置文本层的 rectAnchor 属性和填充,但似乎都没有任何效果。

创建绘图的代码:

   CGFloat startAngle = [self degreesToRadians:90 + ((360 / [self.dangerRoseData numberOfSectors]) /2.0)];

    NSInteger levels = [self.dangerRoseData numberOfLevels];
    for(int i = 0; i < levels; i++){
        CGFloat radiusD =  (i + 1.0)/ levels;
        CGFloat radius =  MIN(radiusD * (graphHostingView.frame.size.height - 2 * graph.paddingLeft) / 2.8,
                              radiusD * (graphHostingView.frame.size.width - 2 * graph.paddingTop) / 2.8);

        CPTPieChart *lastPie = [plots lastObject];
        CGFloat innerRadius;
        if(lastPie != nil)
            innerRadius = lastPie.pieRadius;
        else
            innerRadius = 0;

        CPTPieChart *piePlot = [[CPTPieChart alloc] init];
        piePlot.backgroundColor = [UIColor clearColor].CGColor;
        piePlot.dataSource = self;
        piePlot.delegate = self;
        piePlot.pieRadius  = radius;
        piePlot.pieInnerRadius  = innerRadius;
        piePlot.identifier      = [self.dangerRoseData nameForLevel:i];
        piePlot.borderLineStyle = lineStyle;
        piePlot.startAngle      = startAngle;
        piePlot.sliceDirection  = CPTPieDirectionClockwise;
        piePlot.labelOffset = -35;//brute force trial and error
        piePlot.labelRotationRelativeToRadius = NO;//new property after 1.0

        [graph addPlot:piePlot];
        [plots addObject:piePlot];
    }

对于标签:

-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index{
....

CPTMutableTextStyle *textStyle = [[CPTMutableTextStyle alloc] init];
textStyle.color = color;
textStyle.fontSize = 36;
CPTTextLayer *label = [[CPTTextLayer alloc] initWithText:@"•" style:textStyle];
return label;
}

我尝试更新到最新版本的 core-plot,它为 CPTPiePlot labelRotationRelativeToRadius 添加了一个新属性,这似乎应该是这个问题的答案,但事实并非如此。使用新版本,我无法将点定位在靠近正确位置的任何位置。

我错过了定位标签的东西吗?

我是否使用完全错误的方法将点放在切片中?

4

1 回答 1

0

好吧,我决定尝试使用图像而不是文本标签,并且定位效果很好,它似乎一点也不像文本标签那样不稳定。为了能够在最里面的饼图中放置点,我还必须改变大小,所以里面的饼不是占据等量的总半径,而是占据其余部分空间的两倍。生成图的代码:

NSInteger levels = [self.dangerRoseData numberOfLevels];
    for(int i = 0; i < levels; i++){
        CPTPieChart *lastPie = [plots lastObject];
        CGFloat innerRadius;
        if(lastPie != nil)
            innerRadius = lastPie.pieRadius;
        else
            innerRadius = 0;

        CGFloat ringThickness;
        ringThickness = ( (graphHostingView.frame.size.width - 2 * graph.paddingTop) / ((levels + 1) * 2) ) * .85;
        if(i == 0)//make the inner circle twice the thickness of the rings
            ringThickness += ringThickness;

        CGFloat radius =  innerRadius + ringThickness;

        int labelOffset = -14;
        if(i == 0)
            labelOffset = -15;

        CPTPieChart *piePlot = [[CPTPieChart alloc] init];
        piePlot.backgroundColor = [UIColor clearColor].CGColor;
        piePlot.dataSource = self;
        piePlot.delegate = self;
        piePlot.pieRadius  = radius;
        piePlot.pieInnerRadius  = innerRadius;
        piePlot.identifier      = [self.dangerRoseData nameForLevel:i];
        piePlot.borderLineStyle = lineStyle;
        piePlot.startAngle      = startAngle;
        piePlot.sliceDirection  = CPTPieDirectionClockwise;
        piePlot.labelOffset = labelOffset;

        [graph addPlot:piePlot];
        [plots addObject:piePlot];
    }

对于标签:

-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index
{
   ...

    CPTImageLayer *layer = [[CPTImageLayer alloc] initWithImage:[UIImage imageNamed:filename]];
    layer.anchorPoint = CGPointMake(0.5, 0.5);
    return layer;
}

请注意,CPTImageLayer 是标准核心图的补充,以降低使用图像的复杂性

于 2012-06-27T14:12:35.740 回答