我有应用程序编译,但我看不到图表。
#import <UIKit/UIKit.h>
#import "CorePlot-CocoaTouch.h"
@interface RaceDetailView : UIView <CPTPlotDataSource, CPTPlotSpaceDelegate>
@property (nonatomic, retain) NSArray *plotData;
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) CPTGraphHostingView *layerHostingView;
@property CGFloat labelRotation;
- (void)setTitleDefaultsForGraph:(CPTGraph *)graph withBounds:(CGRect)bounds;
- (void)setPaddingDefaultsForGraph:(CPTGraph *)graph withBounds:(CGRect)bounds;
-(NSUInteger)numberOfRecords;
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index;
@end
#import "RaceDetailView.h"
@implementation RaceDetailView
@synthesize layerHostingView;
@synthesize labelRotation;
@synthesize title;
@synthesize plotData;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
title = @"my race chart";
plotData = [[NSMutableArray alloc] initWithObjects:
[NSNumber numberWithDouble:20.0],
[NSNumber numberWithDouble:30.0],
[NSNumber numberWithDouble:60.0],
nil];
CPTGraph *graph = [[[CPTXYGraph alloc] initWithFrame:frame] autorelease];
//[self addGraph:graph toHostingView:layerHostingView];
layerHostingView.hostedGraph = graph;
//[self applyTheme:theme toGraph:graph withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]];
[graph applyTheme:[CPTTheme themeNamed:kCPTDarkGradientTheme]];
[self setTitleDefaultsForGraph:graph withBounds:frame];
[self setPaddingDefaultsForGraph:graph withBounds:frame];
// Setup scatter plot space
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.allowsUserInteraction = YES;
plotSpace.delegate = self;
// Grid line styles
CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle];
majorGridLineStyle.lineWidth = 0.75;
majorGridLineStyle.lineColor = [[CPTColor colorWithGenericGray:0.2] colorWithAlphaComponent:0.75];
CPTMutableLineStyle *minorGridLineStyle = [CPTMutableLineStyle lineStyle];
minorGridLineStyle.lineWidth = 0.25;
minorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.1];
CPTMutableLineStyle *redLineStyle = [CPTMutableLineStyle lineStyle];
redLineStyle.lineWidth = 10.0;
redLineStyle.lineColor = [[CPTColor redColor] colorWithAlphaComponent:0.5];
// Axes
// Label x axis with a fixed interval policy
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;
CPTXYAxis *x = axisSet.xAxis;
x.majorIntervalLength = CPTDecimalFromString(@"0.5");
x.orthogonalCoordinateDecimal = CPTDecimalFromString(@"1.0");
x.minorTicksPerInterval = 2;
x.majorGridLineStyle = majorGridLineStyle;
x.minorGridLineStyle = minorGridLineStyle;
x.title = @"X Axis";
x.titleOffset = 30.0;
x.titleLocation = CPTDecimalFromString(@"1.25");
// Label y with an automatic label policy.
CPTXYAxis *y = axisSet.yAxis;
y.labelingPolicy = CPTAxisLabelingPolicyAutomatic;
y.orthogonalCoordinateDecimal = CPTDecimalFromString(@"1.0");
y.minorTicksPerInterval = 2;
y.preferredNumberOfMajorTicks = 8;
y.majorGridLineStyle = majorGridLineStyle;
y.minorGridLineStyle = minorGridLineStyle;
y.labelOffset = 10.0;
y.title = @"Y Axis";
y.titleOffset = 30.0;
y.titleLocation = CPTDecimalFromString(@"1.0");
// Rotate the labels by 45 degrees, just to show it can be done.
labelRotation = M_PI * 0.25;
// Set axes
//graph.axisSet.axes = [NSArray arrayWithObjects:x, y, y2, nil];
graph.axisSet.axes = [NSArray arrayWithObjects:x, y, nil];
// Create a plot that uses the data source method
CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease];
dataSourceLinePlot.identifier = @"Data Source Plot";
CPTMutableLineStyle *lineStyle = [[dataSourceLinePlot.dataLineStyle mutableCopy] autorelease];
lineStyle.lineWidth = 3.0;
lineStyle.lineColor = [CPTColor greenColor];
dataSourceLinePlot.dataLineStyle = lineStyle;
dataSourceLinePlot.dataSource = self;
[graph addPlot:dataSourceLinePlot];
// Auto scale the plot space to fit the plot data
// Extend the y range by 10% for neatness
[plotSpace scaleToFitPlots:[NSArray arrayWithObjects:dataSourceLinePlot, nil]];
CPTPlotRange *xRange = plotSpace.xRange;
CPTPlotRange *yRange = plotSpace.yRange;
[xRange expandRangeByFactor:CPTDecimalFromDouble(1.3)];
[yRange expandRangeByFactor:CPTDecimalFromDouble(1.3)];
plotSpace.yRange = yRange;
// Restrict y range to a global range
CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f)
length:CPTDecimalFromFloat(2.0f)];
plotSpace.globalYRange = globalYRange;
// set the x and y shift to match the new ranges
CGFloat length = xRange.lengthDouble;
//xShift = length - 3.0;
length = yRange.lengthDouble;
//yShift = length - 2.0;
// Add plot symbols
CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle];
symbolLineStyle.lineColor = [CPTColor blackColor];
CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
plotSymbol.fill = [CPTFill fillWithColor:[CPTColor blueColor]];
plotSymbol.lineStyle = symbolLineStyle;
plotSymbol.size = CGSizeMake(10.0, 10.0);
dataSourceLinePlot.plotSymbol = plotSymbol;
// Set plot delegate, to know when symbols have been touched
// We will display an annotation when a symbol is touched
dataSourceLinePlot.delegate = self;
dataSourceLinePlot.plotSymbolMarginForHitDetection = 5.0f;
// Add legend
graph.legend = [CPTLegend legendWithGraph:graph];
graph.legend.textStyle = x.titleTextStyle;
graph.legend.fill = [CPTFill fillWithColor:[CPTColor darkGrayColor]];
graph.legend.borderLineStyle = x.axisLineStyle;
graph.legend.cornerRadius = 5.0;
graph.legend.swatchSize = CGSizeMake(25.0, 25.0);
graph.legendAnchor = CPTRectAnchorBottom;
graph.legendDisplacement = CGPointMake(0.0, 12.0);
}
return self;
}
- (void)setTitleDefaultsForGraph:(CPTGraph *)graph withBounds:(CGRect)bounds
{
graph.title = title;
CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle];
textStyle.color = [CPTColor grayColor];
textStyle.fontName = @"Helvetica-Bold";
textStyle.fontSize = round(bounds.size.height / 20.0f);
graph.titleTextStyle = textStyle;
graph.titleDisplacement = CGPointMake(0.0f, round(bounds.size.height / 18.0f)); // Ensure that title displacement falls on an integral pixel
graph.titlePlotAreaFrameAnchor = CPTRectAnchorTop;
}
- (void)setPaddingDefaultsForGraph:(CPTGraph *)graph withBounds:(CGRect)bounds
{
float boundsPadding = round(bounds.size.width / 20.0f); // Ensure that padding falls on an integral pixel
graph.paddingLeft = boundsPadding;
if (graph.titleDisplacement.y > 0.0) {
graph.paddingTop = graph.titleDisplacement.y * 2;
}
else {
graph.paddingTop = boundsPadding;
}
graph.paddingRight = boundsPadding;
graph.paddingBottom = boundsPadding;
}
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot
{
return [plotData count];
}
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
NSNumber *num;
if (fieldEnum == CPTPieChartFieldSliceWidth) {
num = [plotData objectAtIndex:index];
}
else {
return [NSNumber numberWithInt:index];
}
return num;
}
@end
编辑:您可能会注意到这来自CorePlot
示例 SimpleScatterPlot 。
答案 0 :(得分:3)
为什么这段代码在UIView
?此代码通常位于视图控制器(UIViewController
)中。您从中提取示例的Plot Gallery应用程序稍微复杂一些,因为它在多个位置使用图表 - 在主视图区域中,并且还为列表或浏览器视图制作缩略图图像。
你有没有设置layerHostingView
?它是否在视图层次结构中可见?
检查您的数据源是否为@danielbeard建议。散点图的正确字段名称为CPTScatterPlotFieldX
和CPTScatterPlotFieldY
。
答案 1 :(得分:1)
您正在设置散点图,然后在您要求CPTPieChartFieldSliceWidth的numberForPlot方法中,这是打算吗?你能看到网格线,还是整个图形区域只是空白?