简体   繁体   English

iPhone CorePlot正确格式化y轴

[英]iPhone CorePlot proper formatting of y-axis

I am using CorePlot to graph a set of data. 我正在使用CorePlot来绘制一组数据。 Data for my x-axis consists of dates, while data for my y-axis consists of floats (which I then turn into NSNumber). 我的x轴的数据由日期组成,而我的y轴的数据由浮点数组成(然后我将其转换为NSNumber)。 I am getting data from a feed, and the feed returns numbers with a large number of decimals, eg: 0.46673718852844, 4.59392222219, 353.1293012045. 我从Feed中获取数据,并且Feed返回具有大量小数的数字,例如:0.46673718852844,4.59392222219,353.1293012045。 I'm using the following piece of code to properly format y-axis: 我正在使用以下代码来正确格式化y轴:

NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMaximumFractionDigits:3];
[numberFormatter setPositiveFormat:@"###0.000"];    
CPTXYAxis *y = axisSet.yAxis;
y.labelingPolicy = CPTAxisLabelingPolicyAutomatic;
y.minorTicksPerInterval = 1;
y.preferredNumberOfMajorTicks = 5;
y.labelFormatter = numberFormatter;

In most cases, everything works fine. 在大多数情况下,一切正常。 However, sometimes it displays the same value at multiple positions along the axis. 但是,有时它会沿轴的多个位置显示相同的值。 See image below: 见下图:

在此输入图像描述

The values are presented correctly, I would just like to avoid unnecessary (0.466) labels. 值正确显示,我只想避免不必要的(0.466)标签。 I've even tried to round the numbers to 3 decimals in numberForPlot method: 我甚至试图在numberForPlot方法中将数字四舍五入到3位小数:

if(fieldEnum == CPTScatterPlotFieldY)
{ 
        float floatNum = r.value;
        floatNum *= 1000;
        int intValue = (int) floatNum;
        float decimal = floatNum - intValue;
        if (decimal > 0.5) {
            intValue++;
        }
        floatNum = intValue /1000.0;
        return [NSNumber numberWithFloat:floatNum];

}

but there is no difference in labels. 但标签没有区别。

The preferredNumberOfMajorTicks property tells the labeling algorithm how many tick marks to use. preferredNumberOfMajorTicks属性告诉标记算法要使用多少刻度线。 If you want three ticks, set it to 3. You could also increase the maximum number of fraction digits for the number formatter to avoid the rounding issue altogether. 如果您想要三个刻度,请将其设置为3.您还可以增加数字格式化程序的最大小数位数,以避免完全舍入问题。

What I did here was dynamically set my preferredNumberOfMajorTicks property while the graph is plotted. 我在这里做的是在绘制图形时动态设置我的preferredNumberOfMajorTicks属性。 Since my formatter shows 3 decimal places, I used the following code to change the number of ticks depending on the Y axis range so that the formatter will show a unique value on the axis at each tick. 由于我的格式化程序显示3个小数位,因此我使用以下代码根据Y轴范围更改刻度数,以便格式化程序在每个刻度线的轴上显示唯一值。 Too many ticks means the decimal places get cut off and there are duplicate values on the Y axis. 太多刻度表示小数位被切断,Y轴上有重复值。

            CPTXYAxis *y          = axisSet.yAxis;
            {
                y.preferredNumberOfMajorTicks = round([newYRange.length floatValue]/0.001);
            }

I hope this helps. 我希望这有帮助。

I believe that because you have said that you want 5 major ticks, that is what you are going to get, regardless of how close the y axis values are. 我相信,因为你已经说过你需要5个主要滴答,这就是你要得到的,无论y轴值有多近。 If you sense that the values are too close together, you will probably have to adjust your preferredNumberOfMajorTicks property. 如果您感觉到值太靠近,则可能需要调整preferredNumberOfMajorTicks属性。

In my app that I am using Core Plot, I turned off the automatic axis labeling and I am putting together my own x and y axis labels. 在我的应用程序中,我正在使用Core Plot,我关闭了自动轴标签,我正在整理我自己的x和y轴标签。 It is a bit more work, but i like the flexibility of doing it myself. 这是一项更多的工作,但我喜欢自己做的灵活性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM