Swift iOS图表库:不显示备份数据的x轴标签

Swift iOS图表库:不显示备份数据的x轴标签,swift,ios-charts,Swift,Ios Charts,我正在使用iOS流行图表库的3.1.1版。我遇到了一个关于x轴标签的问题,我似乎无法在网上找到答案: 假设我想要一张一周中每天都有一个x轴标签的图表(即:s,M,T,W,T,F,s)。我读过的许多论坛都建议采用如下建议的方法在x轴上设置自定义值格式化程序: 这适用于在我有数据的日期计算标签。我在使用这种方法时遇到的问题是,如果我没有特定日期的数据,则无法生成该日期的标签 例如,如果要使用如下所示的自定义值格式化程序: public class CustomChartFormatter: NSOb

我正在使用iOS流行图表库的3.1.1版。我遇到了一个关于x轴标签的问题,我似乎无法在网上找到答案:

假设我想要一张一周中每天都有一个x轴标签的图表(即:s,M,T,W,T,F,s)。我读过的许多论坛都建议采用如下建议的方法在x轴上设置自定义值格式化程序:

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

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

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个标签,一周中每天一个,而不管我的支持数据是什么?非常感谢。

首先,您是否调试了
返回天数[Int(value)]
?从您的屏幕截图中可以明显看出,int cast后的
降低了精度。e、 g.
2.1
2.7
将是
2
,它总是显示
T
。您必须首先查看您的


如果您确定始终只能获得7个xaxis标签,那么一个棘手的方法是强制
computeAxisValues
始终具有[0,1,2,3,4,5,6]

也就是说,确保数据x范围为[1,7](或[0,6]),并且在
@objc open func computeAxisValues(min:Double,max:Double)
中,应该能够看到
min
为1,
max
为7

然后重写此方法,将
axis.entries=[Double]()
设置为[0,1,2,3,4,5,6],而不进行任何计算。这将为您提供正确的映射


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

好的,多亏@wingzero的评论,我才能够使此方法正常工作。要做到这一点,需要做几件事。为了简单起见,我将解释如何让“一周中的几天”标签按照我最初的要求工作。但是,如果您遵循这些步骤,您应该能够调整它们,以按照您喜欢的方式设置图表的格式(例如,使用一年中的月份)

1) 确保图表的x轴最小值和最大值已设置。在本例中,您希望说:
chartView.xAxis.axisMinimum=0.0
chartView.axisMinimum=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.xaxisrender=xaxisweekrender()

3) 创建
IAxisValueFormatter
的子类,该子类接受我们在步骤2中传递给图表的值([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()

对于上面的请求,您需要添加0值的虚拟数据,因为此库不支持不添加任何数据的X值。谢谢您的回答。但是,这实际上不起作用,因为这些0值仍将绘制在图形上。你知道一种绕过库绘制它们的方法吗?首先,我想你应该覆盖
computeAxisValues
,而不是
computeAxis
,其次,似乎不需要
forcelabelenabled
,如果您在我的代码中覆盖了
computeAxisValues
我覆盖了
computeAxisValues
computeAxis
,以查看哪个被击中。只有
computeAxis
做了,所以我删除了
computeAxisValues
。它按预期的那样工作。很高兴知道不需要启用
ForceLabels
-可能有点过火,但我会暂时保留它,因为它不会破坏任何东西。
computeAxisValues
肯定会被调用。无论如何它都不会被调用,这是计算轴标签的基本函数。我不建议使用
computeAxis
的原因是你必须尊重
倒置的
功能,在你的回答中,你似乎完全放弃了它。这非常有用!谢谢