核心情节月x轴(iphone)
我想在iphone上使用coreplot绘制一个XY图,其中x轴上的日期和y轴上的一些值。 参考使用coreplot SDK发布的DatePlot示例,我能够以月为单位在x轴上绘制日期图形(即x从月份的1日期到最后日期)。 现在我想要一个年度量表,即我想在x轴上显示所有月份名称(1月,2月,3月等),并将我的剔号间隔显示为一个月的时间。
我使用下面的代码来显示月度值
oneXUnit = 60 * 60 * 24;
x.majorIntervalLength = CPDecimalFromFloat((float) oneXUnit);
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init]autorelease];
NSString *dateString = @"0";
[dateFormatter setDateFormat:@"MM"];
CPTimeFormatter *timeFormatter = [[CPTimeFormatter alloc]initWithDateFormatter:dateFormatter];
timeFormatter.referenceDate = [dateFormatter dateFromString:dateString];
x.labelFormatter = timeFormatter;
现在对于年度模式,x tick需要一个月。 我尝试了下面的代码,但没有工作
oneXUnit = 60 * 60 * 24 * 30;
x.majorIntervalLength = CPDecimalFromFloat((float) oneXUnit);
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init]autorelease];
NSString *dateString = @"Jan";
[dateFormatter setDateFormat:@"MMM"];
CPTimeFormatter *timeFormatter = [[CPTimeFormatter alloc]initWithDateFormatter:dateFormatter];
timeFormatter.referenceDate = [dateFormatter dateFromString:dateString];
x.labelFormatter = timeFormatter;
我认为这种逻辑失败是因为每个月的天数不同。 现在几个月在x轴上显示,但它显示为
一月,三月,四月,五月,五月,六月,七月,八月,九月,十月,十一月,分解。
你可以看到没有2月份,5月有2个条目。 我的滴答时间间隔如何与每个月的天数相关联。 任何解决方案 感谢致敬,
我有同样的问题。 我的快速和肮脏的解决方案是做自定义标签,遍历整个月,并添加时间戳到一个数组。
x.labelingPolicy = CPAxisLabelingPolicyNone;
NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:12];
NSMutableArray *customMajorTickLocations = [NSMutableArray arrayWithCapacity:12];
NSMutableArray *customMinorTickLocations = [NSMutableArray arrayWithCapacity:12];
NSDate* dateCurrentMonth = [[NSDate date] dateAtStartOfYear];
for (NSUInteger iMonth = 0; iMonth < 12; iMonth++)
{
NSNumber* numMajorTickLocation = [NSNumber numberWithDouble:[dateCurrentMonth timestampAtMidnight]];
NSNumber* numMinorTickLocation = [NSNumber numberWithDouble:[dateCurrentMonth timestampAtMidnight]+14*oneDay];
CPAxisLabel *newLabel = [[CPAxisLabel alloc] initWithText:[dateFormatter stringFromDate:dateCurrentMonth] textStyle:x.labelTextStyle];
newLabel.tickLocation = [numMinorTickLocation decimalValue];
newLabel.offset = x.labelOffset + x.majorTickLength;
dateCurrentMonth = [[dateCurrentMonth dateByAddingDays:32] dateAtStartOfMonth];
[customLabels addObject:newLabel];
[customMajorTickLocations addObject:numMajorTickLocation];
[customMinorTickLocations addObject:numMinorTickLocation];
[newLabel release];
}
// add a last major tick to close the range
[customMajorTickLocations addObject:[NSNumber numberWithDouble:[dateCurrentMonth timestampAtMidnight]]];
x.axisLabels = [NSSet setWithArray:customLabels];
x.majorTickLocations = [NSSet setWithArray:customMajorTickLocations];
x.minorTickLocations = [NSSet setWithArray:customMinorTickLocations];
刚在相关问题中回答。 使用CPTCalendarFormatter而不是CPTTimeFormatter,当您必须设置以秒为单位的时间间隔偏移(例如小时= 60 * 60,日= 24 * 60 * 60)时很好,但几个月的可变天数/秒(30 * 24 * 60 * 60或31 * 24 * 60 * 60,28,闰年等)。 CPTCalendarFormatter允许您为标签上的日期计算确定日历单位。 通过这种方式,修复了参考日期和参考日历单位,在数据源方法中,您必须返回从参考日期开始的那些单位的数量。
这是完整的代码,享受。
在viewDidLoad或其他地方初始化图形:
[...]
// Graph host view
CPTGraphHostingView* hostView = [[CPTGraphHostingView alloc] initWithFrame:self.view.frame];
[self.view addSubview: hostView];
// Your graph
CPTGraph* graph = [[CPTXYGraph alloc] initWithFrame:hostView.bounds];
hostView.hostedGraph = graph;
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)[graph axisSet];
// xAxis configuration
CPTXYAxis *xAxis = [axisSet xAxis];
[xAxis setLabelingPolicy:CPTAxisLabelingPolicyFixedInterval];
// Prepare dateFormat for current Locale, we want "JAN 2014" "FEB 2014" and so on
NSString *dateComponents = @"MMMYY";
NSString *localDateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:[NSLocale currentLocale]];
NSDateFormatter *labelDateFormatter=[[NSDateFormatter alloc] init];
labelDateFormatter.dateFormat=localDateFormat;
// Set xAxis date Formatter
CPTCalendarFormatter *xDateYearFormatter = [[CPTCalendarFormatter alloc] initWithDateFormatter:labelDateFormatter];
//Keep in mind this reference date, it will be used to calculate NSNumber in dataSource method
xDateYearFormatter.referenceDate = [NSDate dateWithTimeIntervalSince1970:0];
xDateYearFormatter.referenceCalendarUnit=NSMonthCalendarUnit;
[xAxis setLabelFormatter:xDateYearFormatter];
// yAxis configuration
CPTXYAxis *yAxis = [axisSet yAxis];
[yAxis setMajorIntervalLength:CPTDecimalFromFloat(_YOURYINTERVAL_)];
[yAxis setLabelingPolicy:CPTAxisLabelingPolicyFixedInterval];
[yAxis setLabelFormatter:_YOURYFORMATTER_];
[yAxis setAxisConstraints:[CPTConstraints constraintWithLowerOffset:0.0]]
// Get the (default) plotspace from the graph so we can set its x/y ranges
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;
NSDate *startDate=_YOURSTARTINGDATE_
//Number of months since the reference date
NSInteger xStart=[[[NSCalendar currentCalendar] components: NSCalendarUnitMonth
fromDate: xDateYearFormatter.referenceDate
toDate: _YOURSTARTINGDATE_
options: 0] month];
[plotSpace setXRange: [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(xStart) length:CPTDecimalFromInteger(_YOURDATESARRAY_.count-1)]];
[plotSpace setYRange: [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(_YOURMAXYVALUE_)]];
[...]
数据源方法返回轴上的值:
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
switch (fieldEnum) {
case CPTScatterPlotFieldX: {
NSInteger monthsOffset=[[[NSCalendar currentCalendar] components: NSCalendarUnitMonth fromDate: [NSDate dateWithTimeIntervalSince1970:0] toDate: [_YOURDATESARRAY_ objectAtIndex:index] options: 0] month];
NSNumber *val = [NSNumber numberWithInteger:monthsOffset];
return val;
break;
}
case CPTScatterPlotFieldY: {
NSNumber *val=_YOURVALUEFORYAXIS_;
return val;
break;
}
default:
break;
}
return nil;
}
链接地址: http://www.djcxy.com/p/61031.html
上一篇: Core plot with month on x Axis (iphone)
下一篇: C# datetime format that includes date/month/year and not day