【问题标题】:Trying to enter Date/String in ChartDataEntry尝试在 ChartDataEntry 中输入日期/字符串
【发布时间】:2023-03-20 16:33:01
【问题描述】:

我正在尝试在Charts 中添加一个日期/字符串作为 xAxis 标签(标签之间需要有相等的空间)

我在下面做,但构造函数中的 x 只需要双精度。

有什么想法吗?

for i in 0..<self.grahEntries.count {
     let x1 = self.grahEntries[i].x
     let dateFormatter = DateFormatter()
     dateFormatter.dateFormat = "YYY-MM-DD HH:mm:ss"
     let date = dateFormatter.date(from: x1)
     print(date)
     let dataEntry = ChartDataEntry(x: date, y: self.grahEntries[i].y)//HERE IS MY PROBLEM!! xAxis is only double
     dataEntries.append(dataEntry)
}

 let line1 = LineChartDataSet(values: dataEntries, label: "Units Consumed")
    line1.colors = [NSUIColor.blue]
    line1.mode = .cubicBezier
    line1.cubicIntensity = 0.2


    let gradient = getGradientFilling()
    line1.fill = Fill.fillWithLinearGradient(gradient, angle: 90.0)
    line1.drawFilledEnabled = true

    let data = LineChartData()
    data.addDataSet(line1)
    mChart.data = data
    mChart.setScaleEnabled(false)
    mChart.animate(xAxisDuration: 1.5)

    mChart.xAxis.valueFormatter = DateAxisValueFormatter()
    mChart.xAxis.granularity = 1.0


    mChart.drawGridBackgroundEnabled = false
    mChart.xAxis.drawAxisLineEnabled = false
    mChart.xAxis.drawGridLinesEnabled = false
    mChart.leftAxis.drawAxisLineEnabled = true
    mChart.leftAxis.drawGridLinesEnabled = true
    mChart.rightAxis.drawAxisLineEnabled = false
    mChart.rightAxis.drawGridLinesEnabled = false
    mChart.legend.enabled = false
    mChart.xAxis.enabled = true
    mChart.leftAxis.enabled = true
    mChart.rightAxis.enabled = false

    mChart.xAxis.labelPosition = .bottom

    mChart.xAxis.drawLabelsEnabled = true
    mChart.xAxis.drawLimitLinesBehindDataEnabled = true
    mChart.xAxis.avoidFirstLastClippingEnabled = true

更新:

我按照@ces 所说的那样准确地传播它们,但我仍然看不到标签。我更新了上面的代码以显示表格

【问题讨论】:

  • y的类型是什么?
  • @vadian y 是双精度型

标签: ios swift charts swiftcharts


【解决方案1】:

如果您希望数据均匀分布(即不代表准确的时间线),那么答案会更简单。

将您的 for 循环更改为

var dates: [String] = []
for i in 0..<self.grahEntries.count {
     let x1 = self.grahEntries[i].x
     let dateFormatter = DateFormatter()
     dateFormatter.dateFormat = "YYY-MM-DD HH:mm:ss"
     let date = dateFormatter.date(from: x1)
     dates.append(date)
     let dataEntry = ChartDataEntry(x: Double(i), y: self.grahEntries[i].y)
     dataEntries.append(dataEntry)
}

改变

mChart.xAxis.valueFormatter = DateAxisValueFormatter(dates)

然后更改DataAxisValueFormatter 以在构造函数中接受字符串数组并存储它们。改变

func stringForValue(_ value: Double, axis: AxisBase?) -> String
{
    let i = Int(value)
    return dates[i]
}

【讨论】:

    【解决方案2】:

    正如您所发现的,您需要使用双精度(或数值)作为 x 的值。在我之前根据日期绘制此图的地方,我的方法是使用自纪元以来的秒数将日期转换为数字并转换为天数,使用:-

     date.timeIntervalSince1970 / secondsPerDay
    

    哪里(足够准确):-

    let secondsPerDay = 24.0 * 3600.0
    

    为了为查看器格式化轴上的日期,然后我使用如下格式器:-

    class DateAxisValueFormatter : NSObject, IAxisValueFormatter
    {
      let dateFormatter = DateFormatter()
    
      override init()
      {
        super.init()
        dateFormatter.dateFormat = "dd MMM"
      }
    
      func stringForValue(_ value: Double, axis: AxisBase?) -> String
      {
        let date = Date(timeIntervalSince1970: value * secondsPerDay)
        return dateFormatter.string(from: date)
      }
    }
    

    这会将我使用的值转换回正确的文本。如果你设置

    lineChart.xAxis.valueFormatter = DateAxisValueFormatter()
    lineChart.xAxis.granularity = 1.0
    

    那么你只会在底部看到天数。

    总结一下:

    • 查找日期的数字转换。
    • 将其用作值
    • 在格式化程序中转换回日期。

    【讨论】:

    • 谢谢!它将 xAxis 拆分为 nicley,但我在底部看不到标签(参见上面的代码)。另外,如果我想平均分割 xAxis 而不是按日期呢?
    • mChart.xAxis.drawAxisLineEnabled = false - 这也会停止标签吗?
    • line1.axisDependency = .left
    • 屏幕截图显示底部的图表未完成,即左轴似乎没有很好地关闭。您确定视图完全显示在屏幕上吗?
    • 我硬编码 1 它可以工作。我正在这样做。让 dateseconds = date!.timeIntervalSince1970 / secondsPerDay 让 dataEntry = ChartDataEntry(x:dateseconds, y: self.grahEntries[i].y)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2017-01-18
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多