我正在使用流行的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个标签,一周中的每一天都生成一个标签,而不管我的后备数据是什么?谢谢。
答案 0 :(得分:2)
好吧,感谢@wingzero的评论,我已经能够使它工作。这样做需要做一些事情。为了简单起见,我将解释如何使“星期几”标签按我最初的要求工作。但是,如果按照这些步骤进行操作,则应该可以对它们进行调整以按自己的喜好(例如,一年中的月份)格式化图表。
1)确保已设置图表的x轴最小值和最大值。在这种情况下,您想说:chartView.xAxis.axisMinimum = 0.0
和chartView.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.1
和2.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],而无需进行任何计算。这应该为您提供正确的映射。
但是,在执行此操作之前,我建议您先花一些时间调试此方法,以了解为什么未获得预期值。