【问题标题】:Moving date on x-axisx轴移动日期
【发布时间】:2011-04-20 11:18:44
【问题描述】:

我一直在玩 Core Plot 并尝试创建动态日期 x 轴。从日期图示例中,我设法创建了一个静态日期轴,但想随时创建一个两分钟的窗口并更新 xRange 值。我不确定如何将日期作为 xRange 最小值和长度值传递并在 x 轴上显示时间。

我查看了示例,但我无法使用NSTimeInterval(如果这是如何做到的......)。

下面是图片(如果有帮助的话)

以下是我目前的尝试;有人可以告诉我如何实现这一目标吗?

- (void)loadView {
// Alloc & Init Main View and since the display resolution is 1024x768 take 20 off for labels later
UIView *tmpView = [ [ UIView alloc ] initWithFrame:CGRectMake(0, 0, 1024.0,768.0) ];
[ tmpView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ];
[ tmpView setBackgroundColor:[ UIColor redColor ] ];

// Alloc Graph View
graphView = [ [ CPGraphHostingView alloc ] initWithFrame:CGRectMake(0, 0, 1024.0,768.0) ];
[ tmpView addSubview:[ graphView autorelease ] ];

// Set MainView
[ self setView:[ tmpView autorelease ] ];

}

-(void)viewDidLoad{
[super viewDidLoad];

NSDate *refDate = [NSDate date];

//  NSTimeInterval oneDay = 24 * 60 * 60;
NSTimeInterval oneHour =  60 * 60;
NSTimeInterval fivemin= 5 * 60;
// Create graph from theme
graph = [(CPXYGraph *) [CPXYGraph alloc] initWithFrame:self.view.bounds];

CPTheme *theme = [CPTheme themeNamed:kCPDarkGradientTheme];
[graph applyTheme:theme];
graphView.hostedGraph = graph;

//padding
graph.paddingLeft = 20.0;
graph.paddingTop = 20.0;
graph.paddingRight = 20.0;
graph.paddingBottom = 20.0;

graph.plotAreaFrame.paddingTop=10.0;
graph.plotAreaFrame.paddingLeft=50.0;
graph.plotAreaFrame.paddingRight=35.0;
graph.plotAreaFrame.paddingBottom=50.0;

// Setup scatter plot space
CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
NSTimeInterval xLow = 0.0f;
plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(xLow) length:CPDecimalFromFloat(oneHour)];
plotSpace.yRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0.0f) length:CPDecimalFromFloat(100.0f)];

//Line Styles
CPLineStyle *lineStyle = [CPLineStyle lineStyle];
lineStyle.lineColor = [CPColor redColor];
lineStyle.lineWidth = 2.0f;
CPLineStyle *majorGridLineStyle = [CPLineStyle lineStyle];
majorGridLineStyle.lineWidth = 0.75;
majorGridLineStyle.lineColor = [[CPColor colorWithGenericGray:0.2] colorWithAlphaComponent:0.75];
CPLineStyle *minorGridLineStyle = [CPLineStyle lineStyle];
minorGridLineStyle.lineWidth = 0.25;
minorGridLineStyle.lineColor = [[CPColor whiteColor] colorWithAlphaComponent:0.1];   

CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet;


// X-Axes formatting
CPXYAxis *x = axisSet.xAxis;
x.majorIntervalLength = CPDecimalFromFloat(oneHour);
x.orthogonalCoordinateDecimal = CPDecimalFromString(@"0");
x.minorTicksPerInterval = 0;
x.labelOffset=0;
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateStyle = kCFDateFormatterShortStyle;
CPTimeFormatter *timeFormatter = [[[CPTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease];
timeFormatter.referenceDate = refDate;
x.labelFormatter = timeFormatter;
x.majorGridLineStyle = majorGridLineStyle;
x.minorGridLineStyle = minorGridLineStyle;
x.title=@"Time Axis";


//Y-Axes formatting
CPXYAxis *y = axisSet.yAxis;
y.majorIntervalLength = [ [ NSDecimalNumber decimalNumberWithString:@"10.0" ] decimalValue ];
y.orthogonalCoordinateDecimal = CPDecimalFromString(@"0");
y.minorTicksPerInterval = 5;
y.labelOffset = 0.0;  
y.majorGridLineStyle = majorGridLineStyle;
y.minorGridLineStyle = minorGridLineStyle;
y.preferredNumberOfMajorTicks = 10;
y.minorTickLineStyle = nil;
y.labelTextStyle = nil;
y.visibleRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0.0f) length:CPDecimalFromFloat(100.0f)];
CPConstraints yConstraints = {CPConstraintFixed, CPConstraintFixed};
y.isFloatingAxis=YES;
y.constraints=yConstraints;


// Create a plot that uses the data source method
CPScatterPlot *dataSourceLinePlot = [[[CPScatterPlot alloc] init] autorelease];
dataSourceLinePlot.identifier = @"Date Plot";
dataSourceLinePlot.dataLineStyle = lineStyle;
dataSourceLinePlot.dataSource = self;

[graph addPlot:dataSourceLinePlot];

mydata = [[NSMutableArray alloc]initWithObjects:
          [NSDecimalNumber numberWithInt:0],
          nil ];
//a timer to re-load the graph every 2 seconds and re-draw x-axis 

Timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(testingTimer:) userInfo:nil repeats:YES];

 }


 -(NSUInteger)numberOfRecordsForPlot:(CPPlot *)plot
{
return mydata.count;
 }

-(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
switch ( fieldEnum ) {
    case CPScatterPlotFieldX:
        return (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:index];
    case CPScatterPlotFieldY:
        return [mydata objectAtIndex:index];
}
return nil;
}


-(void) testingTimer: (NSTimer *) Timer{

//generating random number and add to mydata array
testdata=arc4random() % 100;
[mydata addObject:[NSNumber numberWithInt:testdata]];

[graph reloadData];
count++;
CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(count) length:CPDecimalFromFloat(5*30.0f)];

}

【问题讨论】:

    标签: objective-c datetime dynamic core-plot


    【解决方案1】:

    xRange 的位置是您希望绘图开始的位置,例如,如果您为绘图加载了 5 分钟(假设每秒 1 个条目)的数据,并且您希望在第 3 分钟开始,您的位置将为 3 *60。如果您只想显示 2 分钟的数据,您的长度将始终为 2*60。

    您可能还想更改 x.majorIntervalLength,该值控制沿 x 轴放置主要刻度的频率。您的主要刻度通常有一个与之关联的标签,因此您希望将该值降低到更适合仅 2 分钟数据的值

    【讨论】:

    • @andrew lattis 谢谢,我现在可以看到 x 轴在移动,但我无法再看到实际的图形(我可以看到 y 轴上的一个点,但看不到线本身)。但是,如果我为位置提供常量值,我可以看到折线图,count++ 是在 xRange 中实现的错误方法吗?
    • 可能是值超出了 y 轴范围吗?在原始评论的代码中,您将 y 轴范围设置为 0-100,您的值是否都适合该范围?听起来它们可能高于/低于可见范围
    • 这些值肯定在 0 到 100 之间,我可以在 y 轴线上看到图形(在 x=0 处),但它不在实际图形上,如果我将 xrange plotwithLocation 值设置为0.0f 我可以看到图形(但正如您所期望的那样,x 轴不会移动)
    • 好的,现在您添加了图像更有意义。你 nslogged 你的 mydata 对象,看看它是否被正确添加到?
    • @andrew Lattis mydata 数组每秒添加 1 个对象(来自 NSTimer 调用),但我只存储 y 值(不是时间)。这可能是问题吗?另外,我读了一些我需要在修改之前复制 xRange 的地方? (我也试过了,但没有运气)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多