使用CorePlot绘制图形时出现问题

3

我想创建一个基于日志的应用程序,尝试制作一个显示基于24小时时间的活动的图表。一个小时必须分为四个15分钟。我已经尝试使用core plot来完成。我已经附上了我迄今为止所做的代码和得到的图表。

 const CGFloat majorTickLength = 20; // height of the major tick
const CGFloat minorTickLength = 8.0;  // height of the minor tick
//    const CGFloat titleOffset     = self.titleSize;

#if TARGET_OS_IPHONE
CGRect bounds = hostingView.bounds;
#else
CGRect bounds = NSRectToCGRect(hostingView.bounds);
#endif

// Create graph
CPTGraph *graph = [[CPTXYGraph alloc] initWithFrame:bounds];
[self addGraph:graph toHostingView:hostingView];
[self applyTheme:theme toGraph:graph withDefault:[CPTTheme themeNamed:kCPTSlateTheme]];

graph.fill = [CPTFill fillWithColor:[CPTColor blackColor]];

// Plot area
graph.plotAreaFrame.paddingTop    = self.titleSize;
graph.plotAreaFrame.paddingBottom = self.titleSize;
graph.plotAreaFrame.paddingLeft   = self.titleSize;
graph.plotAreaFrame.paddingRight  = self.titleSize;
graph.plotAreaFrame.masksToBorder = NO;

// Setup plot space
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@1440.0];
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@20.0];

// Line styles
CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
axisLineStyle.lineWidth = 2.0;

CPTMutableLineStyle *majorTickLineStyle = [axisLineStyle mutableCopy];
majorTickLineStyle.lineWidth = 1.0;
majorTickLineStyle.lineCap   = kCGLineCapRound;

CPTMutableLineStyle *minorTickLineStyle = [axisLineStyle mutableCopy];
minorTickLineStyle.lineWidth = 1.0;
minorTickLineStyle.lineCap   = kCGLineCapButt;

// Text styles
CPTMutableTextStyle *axisTitleTextStyle = [CPTMutableTextStyle textStyle];
axisTitleTextStyle.fontName = @"Helvetica-Bold";


CPTMutableNumberSet *majorTickLocations = [NSMutableSet set];

for (int i = 60; i <= 1440; i += 60)
{
    [majorTickLocations addObject:@(i)];
}

CPTMutableNumberSet *minorTickLocations = [NSMutableSet set];
for ( NSUInteger loc = 0; loc <= 1440; loc += 15 )
{
    [minorTickLocations addObject:@(loc)];
}


// Axis1
CPTXYAxis *axis1 = [[CPTXYAxis alloc] init];
axis1.plotSpace          = graph.defaultPlotSpace;
axis1.labelingPolicy     = CPTAxisLabelingPolicyNone;
axis1.orthogonalPosition = @1.0;
axis1.tickDirection      = CPTSignPositive;
axis1.axisLineStyle      = axisLineStyle;
axis1.majorTickLength    = majorTickLength;
axis1.majorTickLineStyle = majorTickLineStyle;
axis1.minorTickLength    = minorTickLength;
axis1.minorTickLineStyle = minorTickLineStyle;
axis1.majorTickLocations = majorTickLocations;
axis1.minorTickLocations = minorTickLocations;
// Axis2
CPTXYAxis *axis2 = [[CPTXYAxis alloc] init];
axis2.plotSpace          = graph.defaultPlotSpace;
axis2.labelingPolicy     = CPTAxisLabelingPolicyNone;
axis2.orthogonalPosition = @2.0;
axis2.tickDirection      = CPTSignPositive;
axis2.axisLineStyle      = axisLineStyle;
axis2.majorTickLength    = majorTickLength;
axis2.majorTickLineStyle = majorTickLineStyle;
axis2.minorTickLength    = minorTickLength;
axis2.minorTickLineStyle = minorTickLineStyle;
axis2.majorTickLocations = majorTickLocations;
axis2.minorTickLocations = minorTickLocations;
// Axis3
CPTXYAxis *axis3 = [[CPTXYAxis alloc] init];
axis3.plotSpace          = graph.defaultPlotSpace;
axis3.labelingPolicy     = CPTAxisLabelingPolicyNone;
axis3.orthogonalPosition = @3.0;
axis3.tickDirection      = CPTSignPositive;
axis3.axisLineStyle      = axisLineStyle;
axis3.majorTickLength    = majorTickLength;
axis3.majorTickLineStyle = majorTickLineStyle;
axis3.minorTickLength    = minorTickLength;
axis3.minorTickLineStyle = minorTickLineStyle;
axis3.majorTickLocations = majorTickLocations;
axis3.minorTickLocations = minorTickLocations;
// Axis4
CPTXYAxis *axis4 = [[CPTXYAxis alloc] init];
axis4.plotSpace          = graph.defaultPlotSpace;
axis4.labelingPolicy     = CPTAxisLabelingPolicyNone;
axis4.orthogonalPosition = @4.0;
axis4.tickDirection      = CPTSignPositive;
axis4.axisLineStyle      = axisLineStyle;
axis4.majorTickLength    = majorTickLength;
axis4.majorTickLineStyle = majorTickLineStyle;
axis4.minorTickLength    = minorTickLength;
axis4.minorTickLineStyle = minorTickLineStyle;
axis4.majorTickLocations = majorTickLocations;
axis4.minorTickLocations = minorTickLocations;

CPTMutableAxisLabelSet *axis4LabelSet = [NSMutableSet set];

for ( NSUInteger i = 1; i < 24; i++ )
{
    CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:[NSString stringWithFormat:@"%lu", (unsigned long)i]
                                                      textStyle:axis4.labelTextStyle];
    newLabel.tickLocation = @(i*60);
    newLabel.offset       = axis4.labelOffset + axis4.majorTickLength;

    [axis4LabelSet addObject:newLabel];
}
axis4.axisLabels = axis4LabelSet;



// Add axes to the graph
graph.axisSet.axes = @[axis1, axis2, axis3, axis4];

当前输出 在我的上述代码中,我能够使用majorTickLocations来表示每个小时,使用minorTickLocations来表示15分钟的间隔。但是我的期望输出是如下图所示。每个30分钟的标记也应该有所不同。我该如何实现这一点。期望输出

1个回答

0
添加一个水平轴。在现有的四个轴上,使用小刻度标记表示15分钟间隔,使用大刻度标记表示30分钟间隔。在新轴上,将主要网格线(绘制在majorTickLocations处)设置为每小时一次。您不需要在新轴上放置任何刻度标记。

你能展示一下如何设置主网格线并附上一些示例代码吗? - Mano
我的意思是,如何指定主网格线的位置 - Mano
如何为属性 axis5.majorGridLines 指定值? - Mano
网格线会在刻度位置处绘制。设置相应的线型以使网格线出现。Plot Gallery 应用程序中有很多示例。 - Eric Skroch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接