问题描述
使用 Daniel Gindi 的图表,我面临着将日期值映射到条形图的 xAxis 的挑战。此时,xAxis 标签显示了在创建 BarChartDataEntry 值时从 for 循环的索引值派生的日期表示;但是,我缺少有关如何将标签引用到数据对象中的实际日期的逻辑。从屏幕截图中您可以看到日期是 12 月 31 日,我认为这是由于 for 循环中的索引为“0”所致。
我知道我需要应用 valueFormatter 但我很困惑在哪里设置它以及哪个属性:xAxis?图表数据集?图表数据?
let xAxis = chartView.xAxis
xAxis.labelPosition = .bottom
xAxis.labelFont = .systemFont(ofSize: 10)
xAxis.granularity = 1
// xAxis.labelCount = 7
xAxis.valueFormatter = DateValueFormatter()
xAxis.labelRotationAngle = 65
let leftAxis = chartView.leftAxis
leftAxis.valueFormatter = DefaultAxisValueFormatter(formatter: formatter)
leftAxis.axisMinimum = 0
chartView.rightAxis.enabled = false
let l = chartView.legend
l.horizontalAlignment = .right
l.verticalAlignment = .bottom
l.orientation = .horizontal
l.drawInside = false
l.form = .square
l.formToTextSpace = 4
l.xEntrySpace = 6
let dataArray = allDataArray.compactMap({$0})
var dataEntries: [BarChartDataEntry] = []
for i in 0..<dataArray.count {
// let start = (dataArray[i].eatingData[0].dateOfEvent?.timeIntervalSince1970)!
// let end = dataArray[i].eatingData[0].dateOfEvent!.timeIntervalSince1970 + start
// let totalTime = Double(end - start)
let foodamount = dataArray.flatMap({$0.eatingData.filter({$0.eatingCategory == .snack})})
let nursingAmount = dataArray.flatMap({$0.eatingData.filter({$0.eatingCategory == .nursing})})
let formulaAmmount = dataArray.flatMap({$0.eatingData.filter({$0.eatingCategory == .formula})})
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yy"
guard let date = dateFormatter.date(from: (dataArray[i].eatingData.first?.shortDate)!) else {
print("Couldnt unwrap the date")
return}
print("printing date : \(date)")
let entries = BarChartDataEntry(x: Double(i),yValues: [foodamount[i].amount,nursingAmount[i].amount,formulaAmmount[i].amount])
dataEntries.append(entries)
}
日期打印控制台:
printing date : 2021-02-21 05:00:00 +0000
printing date : 2021-02-20 05:00:00 +0000
我正在使用图表演示中使用的格式化程序(注意,AxisValueFormatter 不在范围内,我相信它已更改为 IAxisValueFormatter):
``` public class DateValueFormatter: NSObject,IAxisValueFormatter {
private let dateFormatter = DateFormatter()
override init() {
super.init()
dateFormatter.dateFormat = "MMM d"
}
public func stringForValue(_ value: Double,axis: AxisBase?) -> String {
return dateFormatter.string(from: Date(timeIntervalSince1970: value))
}
根据 Joakim Danielson 的建议,这是将 xValues 创建为 Double(Date.TimeIntervalSince1970) 对象时的条形图图像。不知道为什么比例尺关闭(条形图就像代表一秒一样)并且每天不显示。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)