【问题标题】:How can I set custom X-Axis label intervals?如何设置自定义 X 轴标签间隔?
【发布时间】:2019-03-27 20:46:27
【问题描述】:

我正在使用https://github.com/danielgindi/Charts

我想要发生的事情:

我希望图表有 2 个带有自定义标签值的 x 轴刻度/标签。我的 x 轴值是日期/时间(我使用基于 IAxisValueFormatter 的 DateTimeFormatter)。例如,如果我的 x 轴最小值是下午 1:00,x 轴最大值是下午 4:00,标签计数设置为 2,我如何自定义我想要的标签值?我希望这种情况下的值是 下午 2:00(标签 1)和下午 3:00(标签 2)。 这个库可以做到吗?

实际情况:

它在图表上显示 2 个 x 轴标签,其值为 label 1 = 2:40 PMlabel 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)"
   }

【问题讨论】:

  • 你能改写一下这个问题和一些更多的代码吗?我不确定我是否理解您需要帮助的确切问题。
  • 我想要始终在图表上显示 2 个标签。我希望能够自定义这些值。我使用 IAxisValueFormatter 以日期/时间显示,但我想显示标签 1 和标签 2 的特定时间值。如何自定义标签 1 和标签 2 的值?
  • 您是否使用github.com/danielgindi/Charts 来获取图表功能?可能这是您想在问题中提及的内容(除了您包含的标签)。另外,如果您可以大致了解它的外观以及您希望它的外观,那也很棒(我想我现在了解您的问题,但仍不确定如何回答)
  • @Lauren 分享与LineChartDataSet 和您的IAxisValueFormatter 实施相关的代码
  • @NitinAlabur 是的,我正在使用图表库。

标签: ios charts ios-charts


【解决方案1】:

更新标签计数并将自定义粒度设置为十二进制倍数,因为时间是在 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 小时的间隔时间为下午 1 点、下午 2 点 30 分、下午 4 点 00 分,即不符合您的期望
      • 为什么是5400?因为1553284800 - 1553274000 = 1080010800/2 = 5400

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多