我正在使用https://github.com/danielgindi/Charts
我想要发生什么:
我希望图表有2个x轴刻度/标签和自定义标签值。我的x轴值是日期/时间(我使用基于IAxisValueFormatter的DateTimeFormatter)。例如,如果我的x轴最小值是下午1:00,x轴最大值是下午4:00,标签计数设置为2,我该如何自定义我想要的标签值?我希望此方案中的值为标签1的下午2:00和标签2的下午3:00。这个库可以实现吗?
实际发生的是什么:
它在图表上显示2个x轴标签,标签值为1 = 2:40 PM,标签2 = 3:46
注意:
我每分钟都会添加一个新的数据点,所以我从一个空的数据集开始,每分钟一次,我将条目添加到数据集中,如下所示:
...
let entry = ChartDataEntry(x: point.x, y: point.y)
lineChartDataSet?.addEntryOrdered(entry)
lineChartData?.notifyDataChanged()
view.notifyDataSetChanged()
view.reloadInputViews()
这是设置x轴标签计数和最小/最大值的代码:
xAxis.labelCount = 2
xAxis.axisMinimum = 1553274000.0 //double value equivalent of 1 pm (timeIntervalSince1970)
xAxis.axisMaximum = 1553284800.0 //double value equivalent of 4 pm (timeIntervalSince1970)
这是我的轴值格式化程序,用于显示日期和时间:
public class GraphDateTimeFormatter: NSObject, IAxisValueFormatter {
private let dateFormatterHourMin = DateFormatter()
private let dateFormatterMonthDay = DateFormatter()
override init() {
super.init()
dateFormatterHourMin.dateFormat = "hh mm a"
dateFormatterMonthDay.dateFormat = "MMM dd"
}
public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
let time = dateFormatterHourMin.string(from: Date(timeIntervalSince1970: value))
let monthDay = dateFormatterMonthDay.string(from: Date(timeIntervalSince1970: value))
return "\(time)\n\(monthDay)"
}
更新标签计数并将自定义粒度设置为十二进制倍数,因为时间在base-12系统中计算,但默认情况下图表遵循base-10系统。
试试这个:
xAxis.labelCount = 4
xAxis.granularity = 3600
笔记:
3600
基本上是60*60
,即一小时内的秒数
根据你给定的下午1点到4点的范围,你想要显示下午2点和下午3点的标签,每隔1小时labelCount
影响granularity
我们需要将其保持在4,因为如果labelCount
保持在2,则最小granularity
必须> = 5400,即1.5小时的间隔给出下午1点,下午2点30分,下午4点,这不符合您的期望
为什么5400
?因为1553284800 - 1553274000 = 10800
和10800/2 = 5400