Using core plot for iPhone, drawing date on x axis

后端 未结 2 1521
孤城傲影
孤城傲影 2021-01-31 00:10

I have available an array of dictionary that contains NSDate and NSNumber values. I wanted to plot date on X axis. For plotting I need to supply xRange

相关标签:
2条回答
  • 2021-01-31 00:56

    Take a look at the DatePlot program in the examples folder. It shows how to format axis labels as dates.

    0 讨论(0)
  • 2021-01-31 00:57

    Here you go, DatePlot working on iOS. Don't forget to check it as correct.

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
    
        // If you make sure your dates are calculated at noon, you shouldn't have to 
        // worry about daylight savings. If you use midnight, you will have to adjust
        // for daylight savings time.
        NSDate *refDate = [NSDate dateWithTimeIntervalSinceReferenceDate:31556926 * 10];
        NSTimeInterval oneDay = 24 * 60 * 60;
    
        // Invert graph view to compensate for iOS coordinates
        CGAffineTransform verticalFlip = CGAffineTransformMakeScale(1,-1);
        self.view.transform = verticalFlip;
    
         // allocate the graph within the current view bounds
        graph = [[CPTXYGraph alloc] initWithFrame: self.view.bounds];
    
        // assign theme to graph
        CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme];
        [graph applyTheme:theme];
    
        // Setting the graph as our hosting layer
        CPTGraphHostingView *hostingView = [[CPTGraphHostingView alloc] initWithFrame:self.view.bounds];
    
        [self.view addSubview:hostingView];
    
        hostingView.hostedGraph = graph;
    
        graph.paddingLeft = 20.0;
        graph.paddingTop = 20.0;
        graph.paddingRight = 20.0;
        graph.paddingBottom = 150.0;
    
        // setup a plot space for the plot to live in
        CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
        NSTimeInterval xLow = 0.0f;
        // sets the range of x values
        plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(xLow)
                                                       length:CPTDecimalFromFloat(oneDay*5.0f)];
        // sets the range of y values
        plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) 
                                                       length:CPTDecimalFromFloat(5)];
    
        // plotting style is set to line plots
        CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle];
        lineStyle.lineColor = [CPTColor blackColor];
        lineStyle.lineWidth = 2.0f;
    
        // X-axis parameters setting
        CPTXYAxisSet *axisSet = (id)graph.axisSet;
        axisSet.xAxis.majorIntervalLength = CPTDecimalFromFloat(oneDay);
        axisSet.xAxis.minorTicksPerInterval = 0;
        axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromString(@"1"); //added for date, adjust x line
        axisSet.xAxis.majorTickLineStyle = lineStyle;
        axisSet.xAxis.minorTickLineStyle = lineStyle;
        axisSet.xAxis.axisLineStyle = lineStyle;
        axisSet.xAxis.minorTickLength = 5.0f;
        axisSet.xAxis.majorTickLength = 7.0f;
        axisSet.xAxis.labelOffset = 3.0f;
    
        // added for date
        NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        dateFormatter.dateStyle = kCFDateFormatterShortStyle;
        CPTTimeFormatter *timeFormatter = [[[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease];
        timeFormatter.referenceDate = refDate;
        axisSet.xAxis.labelFormatter = timeFormatter;
    
        // Y-axis parameters setting    
        axisSet.yAxis.majorIntervalLength = CPTDecimalFromString(@"0.5");
        axisSet.yAxis.minorTicksPerInterval = 2;
        axisSet.yAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(oneDay); // added for date, adjusts y line
        axisSet.yAxis.majorTickLineStyle = lineStyle;
        axisSet.yAxis.minorTickLineStyle = lineStyle;
        axisSet.yAxis.axisLineStyle = lineStyle;
        axisSet.yAxis.minorTickLength = 5.0f;
        axisSet.yAxis.majorTickLength = 7.0f;
        axisSet.yAxis.labelOffset = 3.0f;
    
    
        // This actually performs the plotting
        CPTScatterPlot *xSquaredPlot = [[[CPTScatterPlot alloc] init] autorelease];
    
        CPTMutableLineStyle *dataLineStyle = [CPTMutableLineStyle lineStyle];
        //xSquaredPlot.identifier = @"X Squared Plot";
        xSquaredPlot.identifier = @"Date Plot";
    
        dataLineStyle.lineWidth = 1.0f;
        dataLineStyle.lineColor = [CPTColor redColor];
        xSquaredPlot.dataLineStyle = dataLineStyle;
        xSquaredPlot.dataSource = self;
    
        CPTPlotSymbol *greenCirclePlotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
        greenCirclePlotSymbol.fill = [CPTFill fillWithColor:[CPTColor greenColor]];
        greenCirclePlotSymbol.size = CGSizeMake(2.0, 2.0);
        xSquaredPlot.plotSymbol = greenCirclePlotSymbol;  
    
        // add plot to graph
        [graph addPlot:xSquaredPlot];
    
        // Add some data
        NSMutableArray *newData = [NSMutableArray array];
        NSUInteger i;
        for ( i = 0; i < 5; i++ ) {
            NSTimeInterval x = oneDay*i;
            id y = [NSDecimalNumber numberWithFloat:1.2*rand()/(float)RAND_MAX + 1.2];
            [newData addObject:
             [NSDictionary dictionaryWithObjectsAndKeys:
              [NSDecimalNumber numberWithFloat:x], [NSNumber numberWithInt:CPTScatterPlotFieldX], 
              y, [NSNumber numberWithInt:CPTScatterPlotFieldY], 
              nil]];
            NSLog(@"%@",newData);
        }
        plotData = [newData retain];
    
    }
    
    #pragma mark - Plot Data Source Methods
    
    -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot
    {
        return plotData.count;
    }
    
    -(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
    {
        NSDecimalNumber *num = [[plotData objectAtIndex:index] objectForKey:[NSNumber numberWithInt:fieldEnum]];
        return num;
    }
    
    0 讨论(0)
提交回复
热议问题