Попытка ввести дату / строку в ChartDataEntry - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь добавить Date / String в качестве меток 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 сказал, что их распространение точно, но я все еще не вижу ярлыки.Я обновил свой код выше, чтобы показать таблицу enter image description here

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Если вы хотите, чтобы данные располагались равномерно (т. Е. Не представляли точную временную шкалу), тогда ответ проще.

Измените цикл 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]
}
0 голосов
/ 28 февраля 2019

Как вы обнаружили, вам нужно использовать двойное (или числовое значение) в качестве значения для 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

, то в нижней части вы увидите только дни.

Итак, в итоге:

  • Найдите числовое преобразование для даты.
  • Используйте это для значения
  • Преобразовать обратно в дату в форматере.
...