【问题标题】:How to set chart width with Core Plot?如何使用 Core Plot 设置图表宽度?
【发布时间】:2011-08-14 23:21:14
【问题描述】:

我有一个将文件所有者设置为此视图的 nib 文件,并且它只有一个具有自定义类 CPTGraphHostingView 设置的视图。它通过一个插座连接到这个视图。此视图加载,但它显示的是一个非常小的条形图。我真的不确定为什么。此外,在 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;
}

【问题讨论】:

    标签: objective-c ios core-plot


    【解决方案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 上的填充以设置绘图区域框外的整体边距。

    埃里克

    【讨论】:

      【解决方案2】:

      您正在使用以下命令将其设置为一个非常小的图表:

      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]; 进行初始设置,它工作正常。我认为实现中有一些代码可以在发生这种情况时将大小设置为包含视图。

      【讨论】:

      • -1 因为绘图空间决定了图表中可见的数据范围,而不是视图中的物理大小。
      • i.imgur.com/SLj7H.png 我影响了这些行和其他一些行并更改为 CGRectZero 现在我终于可以显示图例但条形仍然很小。
      猜你喜欢
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多