gpt4 book ai didi

ios - 核心剧情: Show yearly labels on the x-axis for daily values

转载 作者:行者123 更新时间:2023-11-28 18:38:30 25 4
gpt4 key购买 nike

对于我的 Core Plot 图表中的绘图值,我在 x 轴上显示基于 NSDate 的值。这些值包含很多年,并且每天绘制。

我想在 x 轴上显示每年或每月的标签,但不是每天。这就是为什么我不能使用 Core Plot 示例应用 DatePlot 中显示的标记方法。

目前我正在手动创建标签(如以下代码片段所示)。不幸的是,此解决方案会导致下面屏幕截图中显示的问题(2001 年的标签与 2002 年太接近)。

[sortedArray enumerateObjectsUsingBlock:  
^(Price *priceItem, NSUInteger idx, BOOL *stop) {

NSDateComponents *yearComponents =
[gregorian components:NSYearCalendarUnit
fromDate:price.dateTime];
NSDateComponents *monthComponents =
[gregorian components:NSMonthCalendarUnit
fromDate:price.dateTime];
NSInteger year = [yearComponents year];
NSInteger month = [monthComponents month];
if (month != previousMonth) {
[minorTickLocations addObject:
[NSDecimalNumber numberWithUnsignedInteger:idx]];
previousMonth = month;
}
if (year != previousYear) {
CPTAxisLabel *newLabel = [[CPTAxisLabel alloc]
initWithText: [NSString stringWithFormat:@"%u", year]
textStyle: axisTitleTextStyle];
newLabel.tickLocation = CPTDecimalFromUnsignedInteger(idx);
newLabel.offset = x.labelOffset + x.majorTickLength / 2.0;
[xAxisLabels addObject:newLabel];
[majorTickLocations addObject:
[NSDecimalNumber numberWithUnsignedInteger:idx]];
previousYear = year;
}
}];

enter image description here

我想知道是否有更好的方法使用标准 Core Plot 方法对此进行编码。

如果日期格式化程序行为可以用于仅显示年 (YYYY)、月和年 (MMM-YYYY) 或仅显示月 (MMM).

编辑

正如 Eric 在他的帖子中所建议的那样,我正在将我的日期转换为年份的分数,以便能够使用 CPTDateFormatter。这就是我设置图表的方式(最初,我只想绘制每个日历年的刻度):

x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy"];
CPTCalendarFormatter *calendarFormatter = [[CPTCalendarFormatter alloc]
initWithDateFormatter:dateFormatter];
calendarFormatter.referenceDate = [sortedPrices[0]
valueForKey:@"dateTime"];
calendarFormatter.referenceCalendarUnit = NSYearCalendarUnit;
x.labelFormatter = calendarFormatter;

这就是我将基于初始整数的索引转换为基于“年分数”的索引的方法:

- (NSArray*)indexArrayOfDatesArray:(NSArray*)dates
{
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *startDate = [sortedCommonSharePrices[0] valueForKey:@"dateTime"];
NSDateComponents *yearComponents = [gregorian components: NSYearCalendarUnit
fromDate:startDate];
NSUInteger startYear = yearComponents.year;
NSMutableArray *array = [NSMutableArray arrayWithCapacity:dates.count];
[dates enumerateObjectsUsingBlock:^(NSDate *date, NSUInteger idx, BOOL *stop) {
NSDateComponents *yearComponents = [gregorian
components:NSYearCalendarUnit fromDate:date];
NSInteger years = [yearComponents year];
NSUInteger numberOfDaysSinceStartOfYear =
[gregorian ordinalityOfUnit:NSDayCalendarUnit
inUnit:NSYearCalendarUnit forDate:date];

NSUInteger totalNumberOfDaysInYear = 365;

double fractionOfYear = (double)numberOfDaysSinceStartOfYear /
(double)totalNumberOfDaysInYear + (double)years - (double)startYear;

[array addObject:[NSNumber numberWithDouble:fractionOfYear]];
}];
return array;
}

这似乎工作正常,但似乎有很多代码(有改进代码的想法吗?)。

问题

缩放和平移时(使用 plotSpace:willChangePlotRangeTo)我想将 x 轴标签设置为新的日期范围(基于新绘图范围内的天数。但是,我得到错误的刻度数和错误的标签(请引用下面的屏幕截图)。

我需要如何设置标签参数才能获得正确的标签?

谢谢你的帮助!

plotSpace:willChangePlotRangeTo 中的代码片段:

NSDateComponents *components = [gregorian components:NSDayCalendarUnit 
fromDate:newStartDate toDate:newEndDate options:0];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
CPTCalendarFormatter *calendarFormatter =
[[CPTCalendarFormatter alloc] initWithDateFormatter:dateFormatter];
calendarFormatter.referenceDate = [sortedPrices[0] valueForKey:@"dateTime"];

if (components.day < 365) {
dateFormatter.dateFormat = @"ddd-MMM-yyyy";
calendarFormatter.referenceCalendarUnit = NSDayCalendarUnit;
} else if (components.day < 365 * 2) {
dateFormatter.dateFormat = @"MMM yyyy";
calendarFormatter.referenceCalendarUnit = NSYearCalendarUnit;
} else if (components.day < 365 * 4) {
dateFormatter.dateFormat = @"qqq yyyy";
calendarFormatter.referenceCalendarUnit = NSYearCalendarUnit;
} else {
dateFormatter.dateFormat = @"yyyy";
calendarFormatter.referenceCalendarUnit = NSYearCalendarUnit;
}
CPTXYAxis *x = axisSet.xAxis;
x.preferredNumberOfMajorTicks = 10;
x.majorIntervalLength = CPTDecimalFromDouble(0.1);
x.minorTicksPerInterval = 1;
x.labelFormatter = calendarFormatter;

Wrong ticks and labels

最佳答案

提供您自己的标签政策,如下所示:

...
CPTXYAxis *x = axisSet.xAxis;
int totalNumberOfYearsToShow = 3;
int startYear = 2010;
int i = 0;
NSMutableSet *xLabels = [NSMutableSet setWithCapacity:totalRecords];
NSMutableSet *xLocations = [NSMutableSet setWithCapacity:totalRecords];

while (i < totalNumberOfYearsToShow)
{
NSNumber *xData = [NSNumber numberWithInt:(i + startYear)];
CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:[xData stringValue] textStyle:x.labelTextStyle];
label.tickLocation = CPTDecimalFromInt([xData intValue]);
label.offset = x.majorTickLength;

if (label)
{
[xLabels addObject:label];
[xLocations addObject:xData];
}

i ++;
}


x.labelingPolicy = CPTAxisLabelingPolicyNone;
x.axisLabels = xLabels;
x.majorTickLocations = xLocations;
...

希望对您有所帮助。

关于ios - 核心剧情: Show yearly labels on the x-axis for daily values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14791346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com