2010-06-08 8 views
15

Ich habe ein Array von Wörterbuch zur Verfügung, die NSDate und NSNumber Werte enthält. Ich wollte das Datum auf der X-Achse darstellen. Für das Plotten muss ich xRanges zur Darstellung mit einigen Dezimalwerten liefern. Ich verstehe nicht, wie kann ich NSDate Werte zu xRange (niedrig und Länge) liefern.Kernstück Verwendung für iPhone, auf x-Achse Zeichnungsdatum

Und was soll es in diesem Verfahren sein:

-(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 

Ich meine, wie mein Date Wert wird als NSNumber zurückgegeben werden? Ich denke, ich sollte da drüben ein paar Intervalle verwenden, aber was sollte die genaue Konvertierung sein? Kann mir jemand erklären, was genau das Datum auf xAxis darstellen soll?

Ich plane meine Handlung in der Hälfte der Ansicht.

+0

Hey Xmax Ich mache das gleiche in meinem Projekt. Haben Sie einen Workaround für dasselbe gefunden? – sandy

+0

Ich stecke an dem Problem fest, dass Sie gegenüberstehen. Also wirst du mir zeigen, was du in dieser Situation tust. –

+0

HINWEIS, eine Sache, in modernen iOS, ist die einzige von Apple empfohlene Methode, einen Datumsformatierer zu verwenden: https://Stackoverflow.com/a/42370648/294884 – Fattie

Antwort

8

Sehen Sie sich das DatePlot-Programm im Ordner examples an. Es zeigt, wie Achsenbeschriftungen als Daten formatiert werden.

+0

Infact Ich folge diesem Beispiel. aber mit diesem Trick, um den Graphen zu plotten, aber Graph ist nicht sichtbar. als Es ist nicht in Reichweite oder etwas falsch mit der Bereitstellung von Werten. tatsächlich enthalten meine Daten das Datum mit vergangenen 3 bis 6 Monaten. Ich bekomme nicht, was genau ich Referenzdatum bereitstellen sollte, wenn NSdate zu äquivalenter NSDecimalNumber konvertiert. Und ich bin verwirrt über plotSpace.xRange. was soll ich liefern? Ich meine, wie kann ich den Bereich der Daten berechnen, die für xRange von meiner Datenquelle geliefert werden? – xmax

+0

Und noch eine Sache ist, dass ich nicht in der Lage bin, Datum auf xAxis, mit dem Beispiel Stock Plot in Coreplot richtig anzuzeigen. wenn ich xAxis auf Core Plot StockPlot Beispiel zeichnen muss, dann wie wäre es ..? – xmax

+2

Das Referenzdatum kann alles sein, was Sie möchten. Es definiert den Nullpunkt für die Achse. Der Startort für den Achsenbereich ist die Differenz zwischen Ihrem ersten Datum auf der Achse und dem Referenzdatum in Sekunden. Die Bereichslänge ist die Länge des Bereichs in Sekunden (es gibt 86400 Sekunden pro Tag). –

36

Hier gehen Sie, DatePlot arbeitet auf iOS. Vergiss nicht, es als richtig zu prüfen.

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

hey, das hat mir sehr geholfen. Ich kann einfach nicht herausfinden, wie man tatsächlich entscheidet, welcher Wert auf der x-Achse für welchen NSTimeInterval geschrieben wird? – JonasG

+1

Hallo, @zambono, was ist der Typ des Symbols 'plotData'? Ich will die Definition davon wissen. – Sabbath

+1

Mit CorePlot 1.1 müssen Sie die y-Achse nicht mehr invertieren. Der obige Code funktioniert, wenn Sie die Zeilen "verticalFlip" herausnehmen. –