2012-04-03 57 views
2

在散点图上,我的x坐标数据只是表示自时间以秒计的时间的长数字,而y坐标数据如下所示:0.675088,0.670629,0.6669599。我想在y轴上显示的主要ticks是这样的:0.64,0.65,0.66,0.67,但是图表上目前显示的是:0.5,0.7,1.0,1.2。核心图 - 在散点图上绘制非常小的数字

首先,我不知道为什么我会像上面提到的那样得到不规则的滴答间隔(0.5到0.7 = 0.2,0.7到1.0 = 0.3?),但我猜测是因为我正在试验标签政策并将其设置为CPTAxisLabelingPolicyEqualDivisions - 有人可以解释所有这些标签政策的含义吗?

真正的问题是,考虑到我绘制的数字非常小,我应该在y轴上的mainIntervalLength中使用什么样的值?目前我有0.01,但是当我调整这个数值的时候,它的数量级为-n,它实际上对我的图表没有任何影响。

这是我的代码基于Plot_Gallery_iOS DatePlot.m片段

-(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme *)theme 
{ 
CGRect bounds = layerHostingView.bounds; 

NSDate *refDate = [NSDate dateWithTimeIntervalSince1970:0]; 
NSTimeInterval oneDay = 24 * 60 * 60; 

CPTGraph *graph = [[[CPTXYGraph alloc] initWithFrame:bounds] autorelease]; 
[self addGraph:graph toHostingView:layerHostingView]; 
[self applyTheme:theme toGraph:graph withDefault:[CPTTheme themeNamed:kCPTPlainWhiteTheme]]; 

[self setTitleDefaultsForGraph:graph withBounds:bounds]; 
[self setPaddingDefaultsForGraph:graph withBounds:bounds]; 

CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; 

NSTimeInterval now = [[NSDate date] timeIntervalSince1970]; 
NSTimeInterval threeMonthsago = now - (90*oneDay); 

plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(threeMonthsago) length:CPTDecimalFromFloat(now - threeMonthsago)]; 
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.6f) length:CPTDecimalFromFloat(0.7f)]; 

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
dateFormatter.dateStyle = kCFDateFormatterShortStyle; 
CPTTimeFormatter *timeFormatter = [[[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease]; 
timeFormatter.referenceDate = refDate; 

// Axes 
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; 
CPTXYAxis *x   = axisSet.xAxis; 
x.majorIntervalLength   = CPTDecimalFromFloat(oneDay*30); 
x.orthogonalCoordinateDecimal = CPTDecimalFromFloat(0.6f); 
x.minorTicksPerInterval  = 7; 
x.labelFormatter   = timeFormatter; 
x.labelRotation    = M_PI/4; 
x.preferredNumberOfMajorTicks = 5; 

CPTXYAxis *y = axisSet.yAxis; 
y.majorIntervalLength   = CPTDecimalFromDouble(0.001); 
y.labelingPolicy = CPTAxisLabelingPolicyEqualDivisions; 
y.preferredNumberOfMajorTicks = 5; 
y.minorTicksPerInterval  = 10; 
y.orthogonalCoordinateDecimal = CPTDecimalFromFloat(now); 
// y.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.6f) length:CPTDecimalFromFloat(0.1f)]; 
CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease]; 
dataSourceLinePlot.identifier = @"Date Plot"; 

// [plotSpace scaleToFitPlots:[NSArray arrayWithObjects:dataSourceLinePlot, nil]]; 

CPTMutableLineStyle *lineStyle = [[dataSourceLinePlot.dataLineStyle mutableCopy] autorelease]; 
lineStyle.lineWidth    = .5f; 
lineStyle.lineColor    = [CPTColor greenColor]; 
dataSourceLinePlot.dataLineStyle = lineStyle; 

// Auto scale the plot space to fit the plot data 
// Extend the ranges by 30% for neatness 
[plotSpace scaleToFitPlots:[NSArray arrayWithObjects:dataSourceLinePlot, nil]]; 
CPTMutablePlotRange *xRange = [[plotSpace.xRange mutableCopy] autorelease]; 
CPTMutablePlotRange *yRange = [[plotSpace.yRange mutableCopy] autorelease]; 
[xRange expandRangeByFactor:CPTDecimalFromDouble(1.3)]; 
[yRange expandRangeByFactor:CPTDecimalFromDouble(1.3)]; 
plotSpace.xRange = xRange; 
plotSpace.yRange = yRange; 

dataSourceLinePlot.dataSource = self; 
[graph addPlot:dataSourceLinePlot]; 
} 

UPDATE:

y.labelingPolicy = CPTAxisLabelingPolicyLocationsProvided; 

NSSet *majorTickLoc = [NSSet setWithObjects:[NSDecimalNumber numberWithFloat:0.64f], [NSDecimalNumber numberWithFloat:0.65f], [NSDecimalNumber numberWithFloat:0.66f], [NSDecimalNumber numberWithFloat:0.67f],[NSDecimalNumber numberWithFloat:0.68f],nil]; 
y.majorTickLocations = majorTickLoc; 

通过这样设置自定义Ÿ主要蜱问题解决了但这个数字似乎仍然是四舍五入的,即只有一个小数位0.6,0.7,0.7等,结果证明这只是标签。标签上设置数字格式化的工作原理:

NSNumberFormatter *yFormatter = [[NSNumberFormatter alloc] init]; 
[yFormatter setMinimumFractionDigits:4]; 
[yFormatter setMaximumFractionDigits:4]; 
[yFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
y.labelFormatter = yFormatter; 

回答

0

试试这个下面的代码:

y.majorIntervalLength = CPTDecimalFromString(@"0.1") 
+0

我不确定这是否回答我的问题?我希望下面的数字作为y主要蜱:0.64,0.65,0.66,0.67,但我不知道如何实现这一点。 – user1187378 2012-04-03 05:43:46

+0

现在我更新了answer.try这段代码...! – Dinesh 2012-04-03 06:39:32

0

设置labelFormatter为y轴。

NSNumberFormatter *newFormatter = [[[NSNumberFormatter alloc] init] autorelease]; 
newFormatter.minimumIntegerDigits = 1; 
newFormatter.maximumFractionDigits = 2; 
newFormatter.minimumFractionDigits = 2; 
y.labelFormatter = newFormatter;