Swift 图表条形图 X 轴日期格式器

问题描述

使用 Daniel Gindi 的图表,我面临着将日期值映射到条形图的 xAxis 的挑战。此时,xAxis 标签显示了在创建 BarChartDataEntry 值时从 for 循环的索引值派生的日期表示;但是,我缺少有关如何将标签引用到数据对象中的实际日期的逻辑。从屏幕截图中您可以看到日期是 12 月 31 日,我认为这是由于 for 循环中的索引为“0”所致。

BarChart xAxis

我知道我需要应用 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) 对象时的条形图图像。不知道为什么比例尺关闭(条形图就像代表一秒一样)并且每天不显示

Skinny Bars

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...