Как я могу установить пользовательские интервалы меток оси X? - PullRequest
0 голосов
/ 22 марта 2019

Я использую https://github.com/danielgindi/Charts

Что я хочу, чтобы произошло:

Я хочу, чтобы на графике было 2 галочки / метки по оси X с пользовательскими значениями меток Мои значения по оси X указаны в дате / времени (я использую DateTimeFormatter, основанный на IAxisValueFormatter). Например, если мой минимум по оси X составляет 13:00, а максимум по оси X - 16:00, а количество меток установлено на 2, как я могу настроить то, что я хочу, чтобы значения меток были? Я хочу, чтобы значения в этом сценарии были 14:00 для метки 1 и 15:00 для метки 2 . Возможно ли это с этой библиотекой?

Что на самом деле происходит:

Отображает 2 метки оси X на графике со значениями метка 1 = 14:40 и метка 2 = 3: 46

Примечание:

Я добавляю новую точку данных каждую минуту, поэтому я начинаю с пустого набора данных и раз в минуту добавляю запись в набор данных следующим образом:

...
let entry = ChartDataEntry(x: point.x, y: point.y)
lineChartDataSet?.addEntryOrdered(entry)
lineChartData?.notifyDataChanged()
view.notifyDataSetChanged()
view.reloadInputViews()

Это код для установки количества меток xAxis и мин / макс:

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)"
   }

1 Ответ

0 голосов
/ 27 марта 2019

Обновите счетчик меток и задайте пользовательскую гранулярность, равную двенадцатеричному кратному, потому что время подсчитывается в системе 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 часа, дающий 13:00, 14:30, 16:00, что не соответствует вашим ожиданиям
      • Почему 5400?потому что 1553284800 - 1553274000 = 10800 и 10800/2 = 5400
...