How to set chart width with Core Plot?
I have a nib file with File's Owner set to this view and it only has one View that has a custom class CPTGraphHostingView set. It is connected to this view via an outlet. This view loads, but what it displays is a very tiny bar graph. And I am really unsure why. Also, anything that is added to the view in IB turns up upside down.
At which point is the chart getting a width set to it? I assume that using self.view.bounds would just make the chart use up all available screen space.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:@"PollResultView" bundle:nil];
self.title = @"Results";
return self;
}
#pragma mark - View lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
graph = [[CPTXYGraph alloc] initWithFrame:self.view.bounds];
CPTXYPlotSpace *barPlotSpace = [[[CPTXYPlotSpace alloc] init] autorelease];
barPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0)
length:CPTDecimalFromFloat(100)];
barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0)
length:CPTDecimalFromFloat(30)];
[graph addPlotSpace:barPlotSpace];
CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle];
majorGridLineStyle.lineWidth = 1.0f;
majorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.75f];
CPTMutableLineStyle *minorGridLineStyle = [CPTMutableLineStyle lineStyle];
minorGridLineStyle.lineWidth = 1.0f;
minorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.25f];
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;
CPTXYAxis *x = axisSet.xAxis;
x.majorIntervalLength = CPTDecimalFromInteger(10);
x.minorTicksPerInterval = 9;
x.orthogonalCoordinateDecimal = CPTDecimalFromInteger(0);
x.majorGridLineStyle = majorGridLineStyle;
x.minorGridLineStyle = minorGridLineStyle;
x.axisLineStyle = nil;
x.majorTickLineStyle = nil;
x.minorTickLineStyle = nil;
x.labelOffset = 10.0f;
x.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-0.5f)
length:CPTDecimalFromFloat(10.0f)];
x.gridLinesRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f)
length:CPTDecimalFromFloat(100.0f)];
x.title = @"X Axis";
x.titleOffset = 30.0f;
x.titleLocation = CPTDecimalFromFloat(5.0f);
x.plotSpace = barPlotSpace;
CPTXYAxis *y = axisSet.yAxis开发者_如何学JAVA;
y.majorIntervalLength = CPTDecimalFromInteger(10);
y.minorTicksPerInterval = 9;
y.orthogonalCoordinateDecimal = CPTDecimalFromInteger(-0.5);
y.preferredNumberOfMajorTicks = 8;
y.majorGridLineStyle = majorGridLineStyle;
y.minorGridLineStyle = minorGridLineStyle;
x.axisLineStyle = nil;
x.majorTickLineStyle = nil;
x.minorTickLineStyle = nil;
x.labelOffset = 10.0f;
y.labelRotation = M_PI/2;
y.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f)
length:CPTDecimalFromFloat(100.0f)];
y.gridLinesRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-0.5f)
length:CPTDecimalFromFloat(10.0f)];
y.title = @"Y Axis";
y.titleOffset = 30.0f;
y.titleLocation = CPTDecimalFromInteger(55);
y.plotSpace = barPlotSpace;
graph.axisSet.axes = [NSArray arrayWithObjects:x, y, nil];
CPTMutableLineStyle *barLineStyle = [[[CPTMutableLineStyle alloc] init] autorelease];
barLineStyle.lineWidth = 1.0f;
barLineStyle.lineColor = [CPTColor whiteColor];
CPTBarPlot *barPlot = [[[CPTBarPlot alloc] init] autorelease];
barPlot.lineStyle = barLineStyle;
barPlot.fill = [CPTFill fillWithColor:[CPTColor colorWithComponentRed:1.0f
green:0.0f
blue:0.5f
alpha:0.5f]];
barPlot.barBasesVary = YES;
barPlot.barWidth = CPTDecimalFromFloat(0.5f); // bar is 50% of the available space
barPlot.barCornerRadius = 10.0f;
barPlot.barsAreHorizontal = NO;
CPTMutableTextStyle *whiteTextStyle = [CPTMutableTextStyle textStyle];
whiteTextStyle.color = [CPTColor whiteColor];
barPlot.barLabelTextStyle = whiteTextStyle;
// barPlot.delegate = self;
barPlot.dataSource = self;
barPlot.identifier = @"Bar Plot 1";
[graph addPlot:barPlot toPlotSpace:barPlotSpace];
CPTBarPlot *barPlot2 = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor]
horizontalBars:NO];
barPlot2.lineStyle = barLineStyle;
barPlot2.fill = [CPTFill fillWithColor:[CPTColor colorWithComponentRed:0.0f
green:1.0f
blue:0.5f
alpha:0.5f]];
barPlot2.barBasesVary = YES;
barPlot2.barWidth = CPTDecimalFromFloat(1.0f);
barPlot2.barCornerRadius = 2.0f;
barPlot2.barsAreHorizontal = NO;
//barPlot2.delegate = self;
barPlot2.dataSource = self;
barPlot2.identifier = @"Bar Plot 2";
[graph addPlot:barPlot2 toPlotSpace:barPlotSpace];
CPTLegend *theLegend = [CPTLegend legendWithGraph:graph];
theLegend.numberOfRows = 2;
theLegend.fill = [CPTFill fillWithColor:[CPTColor colorWithGenericGray:0.15]];
theLegend.borderLineStyle = barLineStyle;
theLegend.cornerRadius = 10.0;
theLegend.swatchSize = CGSizeMake(20.0, 20.0);
whiteTextStyle.fontSize = 16.0;
theLegend.textStyle = whiteTextStyle;
theLegend.rowMargin = 10.0;
theLegend.paddingLeft = 12.0;
theLegend.paddingTop = 12.0;
theLegend.paddingRight = 12.0;
theLegend.paddingBottom = 12.0;
NSArray *plotPoint = [NSArray arrayWithObjects:[NSNumber numberWithInteger:0], [NSNumber numberWithInteger:95], nil];
CPTPlotSpaceAnnotation *legendAnnotation = [[[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:barPlotSpace anchorPlotPoint:plotPoint] autorelease];
legendAnnotation.contentLayer = theLegend;
legendAnnotation.contentAnchorPoint = CGPointMake(0.0f, 1.0f);
[graph.plotAreaFrame.plotArea addAnnotation:legendAnnotation];
graphHostingView.hostedGraph = graph;
}
The hosting view will make the graph fill it's bounds automatically. It doesn't matter what you use when you initialize it as long as the hosting view is sized to its container correctly. There are several things going on here:
You're using white gridlines on a white background. They're hard to see that way. :-) Change the line colors or set a fill on the graph that's a different color.
Copy/paste error on the y-axis:
x.axisLineStyle = nil;
x.majorTickLineStyle = nil;
x.minorTickLineStyle = nil;
should be
y.axisLineStyle = nil;
y.majorTickLineStyle = nil;
y.minorTickLineStyle = nil;
There's no need to set the visible range for your axes--you're not drawing them anyway.
There's no need to set the gridLinesRange either--the default is the plot range which is what you're using.
With barBasesVary, make sure your datasource also provides data for the
CPTBarPlotFieldBarBase
field.When using a plot space annotation, the anchor point for the legend has to be within the plot space ranges (currently x: [0, 100] and y: [0, 30]) or it won't be visible.
You need to set the padding on
graph.plotAreaFrame
to make the axis labels and titles visible. You can also adjust the padding ongraph
to set the overall margin outside the plot area frame.
Eric
You're setting it to a very small graph with these commands:
barPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0)
length:CPTDecimalFromFloat(100)];
barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0)
length:CPTDecimalFromFloat(30)];
100 pixels wide and 30 pixels high is very small, for the actual plot area.
My code uses graph = [CPTXYGraph alloc] initWithFrame:CGRectZero];
for the initial setup, and it works fine. I think there's some code in the implementation that sets the size to the containing view when that happens.
joe
精彩评论