iOS图表库:不显示未支持数据的x轴标签

时间:2018-07-13 22:03:47

标签: swift ios-charts

我正在使用流行的iOS图表库3.1.1版本。我遇到了x轴标签的问题,但似乎找不到在线答案:

比方说,我想在一周中的每一天都有一个带有x轴标签的图表(即:S,M,T,W,T,F,S)。我读过很多论坛都建议采用在x轴上设置自定义值格式器的方法,如下所示:https://github.com/danielgindi/Charts/issues/1340

这适用于在我有数据的日子计算标签。我在使用这种方法时遇到的问题是,如果我没有特定日期的数据,那么将不会生成该天的标签。

例如,如果我要使用如下所示的自定义值格式化程序:

public class CustomChartFormatter: NSObject, IAxisValueFormatter {

    var days: = ["S", "M", "T", "W", "T", "F", "S"]

    public func stringForValue(value: Double, axis: AxisBase?) -> String {
        return days[Int(value)]
    }

}

,我的支持数据如下所示:[(0,15.5),(1、20.1),(6,11.1)]其中0、1和6是天的表示,而15.5、20.1和11.1是天的表示数据点,然后调用stringForValue时,某些日子将永远不会为其生成标签。

由于value始终基于该后备数据,因此在这种情况下,它永远不会等于2、3、4或5。因此,永远不会生成“ T”,“ W”,“ T”和“ F”的标签。

有人知道如何强制库生成7个标签,一周中的每一天都生成一个标签,而不管我的后备数据是什么?谢谢。

2 个答案:

答案 0 :(得分:2)

好吧,感谢@wingzero的评论,我已经能够使它工作。这样做需要做一些事情。为了简单起见,我将解释如何使“星期几”标签按我最初的要求工作。但是,如果按照这些步骤进行操作,则应该可以对它们进行调整以按自己的喜好(例如,一年中的月份)格式化图表。

1)确保已设置图表的x轴最小值和最大值。在这种情况下,您想说:chartView.xAxis.axisMinimum = 0.0chartView.axisMaximum = 6.0。这对于步骤2很重要。

2)正如Wingzero所暗示的,创建XAxisRenderer的子类,该子类允许我们获取在第一步中设置的最小值和最大值,并在步骤中确定应将什么值传递给IAxisValueFormatter子类三。在这种情况下:

class XAxisWeekRenderer: XAxisRenderer {

    override func computeAxis(min: Double, max: Double, inverted: Bool) {
        axis?.entries = [0, 1, 2, 3, 4, 5, 6]
    }

}

请确保将此渲染器通过以下方式传递到您的图表:chartView.xAxisRenderer = XAxisWeekRenderer()

3)创建一个IAxisValueFormatter的子类,该子类采用我们在第二步中传递给图表的值([0、1、2、3、4、5、6])并获得相应的标签名称。这就是我在最初的问题中所做的。回顾一下:

public class CustomChartFormatter: NSObject, IAxisValueFormatter {

    var days: = ["S", "M", "T", "W", "T", "F", "S"]

    public func stringForValue(value: Double, axis: AxisBase?) -> String {
        return days[Int(value)]
    }

}

4)将图形上的labelCount设置为等于所需的标签数。在这种情况下,应该是7。在最后一步下面,我将说明如何执行此操作以及其余步骤。

5)强制启用标签

6)强制在图表上启用粒度并将粒度设置为1。据我了解,将粒度设置为1意味着,如果图表传递给stringForValue的数据不是整数,则图表实际上将对所述数据进行四舍五入或将其视为四舍五入。这很重要,因为如果您输入0.5,则stringForValue可能无法为标签生成正确的字符串。

7)将xAxis上的值格式器设置为您在步骤3中创建的自定义格式器。

步骤4-7(以及设置在步骤3中创建的格式化程序)如下所示:

chartView.xAxis.labelCount = 7
chartView.xAxis.forceLabelsEnabled = true
chartView.xAxis.granularityEnabled = true
chartView.xAxis.granularity = 1
chartView.xAxis.valueFormatter = CustomChartFormatter()

答案 1 :(得分:1)

首先,您是否已调试return days[Int(value)]?从屏幕截图中可以明显看出,在进行整数转换后,您的value会降低精度。例如2.12.7将是2,它始终向您显示T。您必须先查看您的value

如果您确定始终仅获得7个xaxis标签,则一种棘手的方法是强制computeAxisValues始终保持[0,1,2,3,4,5,6]。< / p>

意思是,请确保您的数据x范围为[1,7](或[0,6]),并且在@objc open func computeAxisValues(min: Double, max: Double)中,您应该能够看到min为1和{ {1}}是7。

然后,您可以重写此方法以将max设置为[0,1,2,3,4,5,6],而无需进行任何计算。这应该为您提供正确的映射。

但是,在执行此操作之前,我建议您先花一些时间调试此方法,以了解为什么未获得预期值。