如何使用Core Plot设置图表宽度?

时间:2011-08-14 23:21:15

标签: objective-c ios core-plot

我有一个将文件所有者设置为此视图的nib文件,它只有一个具有自定义类CPTGraphHostingView集的View。它通过插座连接到该视图。加载此视图,但它显示的是一个非常小的条形图。我真的不确定为什么。此外,IB中添加到视图中的任何内容都会颠倒过来。

图表的宽度设置在哪一点?我假设使用self.view.bounds只会使图表耗尽所有可用的屏幕空间。

- (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;
  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;
}

2 个答案:

答案 0 :(得分:1)

托管视图将使图形自动填充其边界。只要托管视图的大小正确地适合其容器,初始化时使用的内容无关紧要。这里有几件事情:

  1. 您在白色背景上使用白色网格线。他们很难看到这种方式。 :-)更改线条颜色或在图形上设置不同颜色的填充。

  2. 在y轴上复制/粘贴错误:

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

    应该是

    y.axisLineStyle = nil; y.majorTickLineStyle = nil; y.minorTickLineStyle = nil;

  3. 无需设置轴的可见范围 - 无论如何都不要绘制它们。

  4. 无需设置gridLinesRange - 默认为您正在使用的绘图范围。

  5. 使用barBasesVary,请确保您的数据源还提供CPTBarPlotFieldBarBase字段的数据。

  6. 使用绘图空间注释时,图例的锚点必须在绘图空间范围内(当前为x:[0,100]和y:[0,30])或者它不会可见。

  7. 您需要在graph.plotAreaFrame上设置填充以使轴标签和标题可见。您还可以调整graph上的填充以设置绘图区域框外的整体边距。

  8. 埃里克

答案 1 :(得分:-1)

您可以使用以下命令将其设置为非常小的图表:

barPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) 
                                                 length:CPTDecimalFromFloat(100)];
barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) 
                                                 length:CPTDecimalFromFloat(30)];
对于实际绘图区域,

100像素宽,30像素高非常小。

我的代码使用graph = [CPTXYGraph alloc] initWithFrame:CGRectZero];进行初始设置,它运行正常。我认为实现中有一些代码会在发生这种情况时将大小设置为包含视图。