【问题标题】:Bars not aligned with X-Axis ticks in CPTBarPlot of Core PlotCore Plot 的 CPTBarPlot 中未与 X 轴刻度对齐的条形图
【发布时间】:2011-12-07 08:58:37
【问题描述】:

我在 Cocoa 的 Core Plot 中遇到 CPTBarPlot 的问题。 即,我无法控制条的步宽。 X 轴刻度通常设置为从 1 到无限的整数,并且可以在其上绘制散点图。

但是,当绘制条形图时,只有第一列开始(当然,具有适当的偏移量)在第一个刻度上。第二个比它的刻度更进一步,第三个和所有其他的也是如此,如屏幕截图所示:

我还没有找到任何属性来控制这个,但是,我找到了数据源方法

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index

与我绘制散点图时的行为不同。也就是说,它仅枚举整数 3,即 CPTBarPlotBindingBarTips,并且不枚举任何其他常量,我特别为没有 CPTBarPlotBindingBarLocations 感到困扰。

如果我从 Plot Gallery mac 演示项目启动 VerticalBarChart,我已经检查并看到相同的方法以相同的顺序枚举 3,4 和 2 个常量。

我使用的是Core Plot 0.9,我相信和这个演示一样。还是……

如何解决这个问题?

这里是X轴标签和刻度的完整代码;

    x.labelRotation = M_PI/4;
    x.labelingPolicy = CPTAxisLabelingPolicyNone;
    x.labelOffset = 0.0;

    CPTMutableTextStyle *labelStyle = [CPTMutableTextStyle textStyle];
    labelStyle.fontSize = 9.0;
    x.labelTextStyle = labelStyle;

//    NSMutableArray *dateArray = [dataSeries objectAtIndex:0];
    NSMutableArray *customTickLocations = [NSMutableArray array];
    NSMutableArray *xAxisLabels = [NSMutableArray array];

    for (int i=0;i<[dataSeries count];i++) {

        [customTickLocations addObject:[NSDecimalNumber numberWithInt:i+1]];
        [xAxisLabels addObject:[dataSeries objectAtIndex:i]];

    }

    //    [customTickLocations addObject:[NSDecimalNumber numberWithInt:[dateArray count]]];

    NSUInteger labelLocation = 0;
    NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:[xAxisLabels count]];
    for (NSNumber *tickLocation in customTickLocations) {
        CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText: [xAxisLabels objectAtIndex:labelLocation++] textStyle:x.labelTextStyle];
        newLabel.tickLocation = [tickLocation decimalValue];
        newLabel.offset = x.labelOffset + x.majorTickLength;
        newLabel.rotation = M_PI/4;
        [customLabels addObject:newLabel];
        [newLabel release];
    }

    [x setMajorTickLocations:[NSSet setWithArray:customTickLocations]];

    x.axisLabels =  [NSSet setWithArray:customLabels];

我必须补充一点,当在同一绘图空间上绘制散点图并且它完全匹配时,使用了相同的刻度......

【问题讨论】:

    标签: cocoa core-plot


    【解决方案1】:

    field 参数将是此枚举的成员之一:

    typedef enum _CPTBarPlotField {
        CPTBarPlotFieldBarLocation = 2, ///< Bar location on independent coordinate axis.
        CPTBarPlotFieldBarTip      = 3, ///< Bar tip value.
        CPTBarPlotFieldBarBase     = 4  ///< Bar base (used only if barBasesVary is YES).
    } CPTBarPlotField;
    

    如果绘图的 plotRange 属性为 nil(默认值),绘图将向数据源询问每个条的位置和提示。如果barBasesVary == YES,它还会询问每个柱的基值。

    【讨论】:

    • 抱歉回答晚了。你在这里写的工作。如果 barBasesVary 不是,则只有 CPTBarPlotFieldBarTip 被委托迭代,而不是其他两个枚举。但是,实现这一点并不能解决条步偏移的问题......无论如何,谢谢。
    • 您的柱形位置和主要刻度位置不对齐。该解决方案将取决于您使用的轴标签策略以及您的数据源如何计算条形位置。发布您的绘图设置和数据源代码,以便我们就如何修复它提供更具体的建议。
    • 我已经添加了代码,对不起。请注意 sam 代码与具有相同数据的散点图完美匹配的事实。
    • 该代码运行良好。确保您的数据源正在返回条形位置的索引值。您的绘图和轴是否使用相同的绘图空间?如果不是,请确保 xRanges 相同。
    • 绘图和轴使用相同的绘图空间。我也可能会说,如果您既不向轴(x 和 y)和图形添加绘图空间,也没有什么不同......我相信这是一个错误......
    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多