2010-06-08 28 views
15

NSDate ve NSNumber değerlerini içeren bir sözlük dizisine sahibim. X ekseninde tarih çizmek istedim. Çizim için bazı ondalık değerler ile çizim yapmak için xRanges göndermem gerekir. XRange (düşük ve uzun) için NSDate değerlerini nasıl temin edebilirim anlamıyorum.iPhone için çekirdek çizim kullanarak, x ekseninde çizim tarihi

Ya bu yöntemde olmalıdır:

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

benim tarih değeri NSNumber olarak iade edilecektir nasıl yani? Sanırım orada biraz aralık kullanmalıyım, ama tam dönüşüm ne olmalı? Herhangi biri bana xAxis'teki tarihi çizmek için tam gereksinimin ne olduğunu açıklayabilir mi?

Çizimi, resmin yarısında çiziyorum.

+0

Hey xmax Projemde aynı şeyi yapıyorum. Aynı şey için herhangi bir geçici çözüm buldunuz mu? – sandy

+0

Karşılaştığınız problemde sıkışıp kaldım. Bu durumda ne yaptığımı bana rehberlik edeceksiniz. –

+0

Not: Bir şey, modern iOS'ta, Apple tarafından bir tarih biçimlendiricisini kullanmanın tek yolu şudur: https://stackoverflow.com/a/42370648/294884 – Fattie

cevap

8

Örnekler klasöründeki DatePlot programına bakın. Eksen etiketlerinin tarih olarak nasıl biçimlendirileceğini gösterir.

+0

Infact Bu örneği takip ediyorum. ancak grafiği çizdirmek için bu numarayı kullan ama grafik görünmüyor. Menzil altında olmadığı ya da değer sağlamada yanlış bir şey olduğu için. aslında, verilerim son 3 ila 6 ay olan tarihi içerir. NSdate'i eşdeğer NSDecimalNumber'e dönüştürürken tam olarak referans tarihi vermem gereken şeyi almıyorum. Ve plotSpace.xRange üzerinde kafam karıştı. ne temin etmeliyim. XRange için veri kaynağımdan tedarik edilecek tarih aralığını nasıl hesaplayabilirim? – xmax

+0

Ve bir şey daha, xrepis'te tarih stoğunu düzgün gösteremiyorum, örnek stok çiziminde coreplot. Eğer çekirdek komplo StockPlot örneğinde xAxis çizmek zorundaysam, o zaman nasıl olur? – xmax

+2

Referans tarihi, istediğiniz herhangi bir şey olabilir. Eksenin sıfır noktasını tanımlar. Eksen aralığı için başlangıç ​​konumu, eksen üzerindeki ilk tarihiniz ile referans tarih arasındaki saniye cinsinden farktır. Aralık uzunluğu, saniye cinsinden aralığın uzunluğudur (bir günde 86400 saniyedir). –

36

İşte, DatePlot iOS üzerinde çalışıyor. Doğru olarak kontrol etmeyi unutma.

- (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, bu bana çok yardımcı oldu. NSTimeInterval için x ekseninde hangi değerin yazıldığına gerçekten karar veremiyorum. – JonasG

+1

Merhaba, @zambono, 'plotData' sembolünün türü nedir? Bunun tanımını bilmek istiyorum. – Sabbath

+1

CorePlot 1.1 ile artık y eksenini tersine çevirmenize gerek yoktur. Yukarıdaki kod, 'verticalFlip' satırlarını çıkarırsanız çalışır. –