如何创建自定义的固定宽度列/ x标签?

时间:2012-09-27 23:24:41

标签: core-plot scatter-plot

目标:为每个数据生成固定宽度的月份列。
问题:列宽因每个#data点而异。因此,一些标签聚集在一起
(例如,'JanFeb'与'Jan ... Feb')由于某个月缺乏数据。

以下代码段创建新标签/月,但无法控制在x轴上静态放置标签;因此,如果特定月份(较少的点)存在的数据项很少,则某些标签可能会合并:

    for (PerformanceDataItem *item in perfDataArray) {
    if (![item.month isEqualToString:currentMonth]) {
        currentMonth = item.month;
        CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:item.month textStyle:x.labelTextStyle];
        newLabel.tickLocation = [[NSDecimalNumber numberWithInt:index] decimalValue];
        newLabel.offset = 2;
        [customLabels addObject:newLabel];
        [newLabel release]; 
    }
    ++index;    
} // end for().

x.axisLineStyle = nil;
x.majorTickLineStyle = nil;
x.minorTickLineStyle = nil;
x.labelingPolicy =  CPTAxisLabelingPolicyNone;


NSSet* customlabelSet = [NSSet setWithArray:customLabels];
x.axisLabels = customlabelSet; 

问题:如何创建自定义的固定宽度列集来绘制数据?

...仅仅将x.labelingPolicy设置为

CPTAxisLabelingPolicyFixedInterval
,使用我自己的NSString标签将x轴与许多数字(1.0 - x.0)相混淆。

也尝试过: a)改变plotSpace.xRange;和 b)改变x.majorIntervalLength。

偏好:自定义标签:CPTAxisLabelingPolicyFixedInterval

P.S。我假设扩大细柱(数据较少)只会绘制一个外推到下个月的下一个数据点;无需填写任何缺失的数据点以等于邻近月份的点数。

============================

基于评论的解决方案:

  

plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(0)   长度:CPTDecimalFromUnsignedInteger(100)];

     

axisFixedInterval.majorIntervalLength = CPTDecimalFromDouble(25.0);       NSDateComponents * dateComponents = [[NSDateComponents alloc] init];

// Set begining date to April 1, 2012:
[dateComponents setMonth:4];
[dateComponents setDay:1];
[dateComponents setYear:2012];
[dateComponents setHour:0];
[dateComponents setMinute:0];
[dateComponents setSecond:0];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *refDate = [gregorian dateFromComponents:dateComponents];
[dateComponents release];
[gregorian release];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateStyle = kCFDateFormatterMediumStyle;
[dateFormatter setDateFormat:@"MMM"];


CPTCalendarFormatter *calFormatter = [[[CPTCalendarFormatter alloc] initWithDateFormatter:dateFormatter] autorelease];
calFormatter.referenceDate = refDate;
calFormatter.referenceCalendarUnit = kCFCalendarUnitMonth;

axisFixedInterval.labelFormatter = calFormatter;

[dateFormatter release];

...这将给我一个3个月的固定分布:[4月,5月,6月,7月,8月];对于5个刻度位置。

...来自plot_gallery_ios示例。

1 个答案:

答案 0 :(得分:0)

您可以使用CPTAxisLabelingPolicyFixedInterval标签政策和创建月标签的labelFormatter。 Core Plot提供了两种可能有用的日期格式器:CPTCalendarFormatterCPTTimeFormatter。您选择哪一个取决于您如何编码数据集中的日期值。