iOS 个图表的 x 轴上的重复值
Repeating values on x-axis for iOS Charts
我正在使用 iOS Charts,并且在我的 x 轴上得到一个重复的标签。
我得到了很多答案 (first, second, third) 我应该设置粒度设置:
xAxis.granularityEnabled = true
xAxis.granularity = 1.0
但是,当我这样做时,x 轴上的标签就消失了。
我的 x 轴设置:
let xAxis = lineChartView.xAxis
xAxis.labelPosition = .bottom
xAxis.labelFont = .boldSystemFont(ofSize: 12)
xAxis.setLabelCount(6, force: false)
xAxis.labelTextColor = UIColor(red: 0, green: 0, blue: 255/255, alpha: 1.0)
xAxis.axisLineColor = UIColor(white: 0.2, alpha: 0.4)
xAxis.gridColor = UIColor(white: 0.8, alpha: 0.4)
xAxis.valueFormatter = ChartXAxisFormatter()
我创建了一个自定义 class 来根据 documentation:
的建议格式化传递到 x 轴的值
class ChartXAxisFormatter: IAxisValueFormatter {
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("MM/dd")
let date = Date(timeIntervalSince1970: value)
return dateFormatter.string(from: date)
}
}
更新
感谢@aiwiguna 并在图表 repo 的帮助下,我能够创建一个包含两件事的自定义 class:日期 (Double) 和相应的索引 ( Int),而不仅仅是日期。
class ChartXAxisFormatter: NSObject, IAxisValueFormatter {
private var dates: [Double]?
convenience init(usingDates dateArr: [Double]) {
self.init()
self.dates = dateArr
}
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
print("value: \(value)")
print("dates: \(dates)")
let index = Int(value)
guard let dates = dates, index < dates.count else {
return "?"
}
let date = dates[index]
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("MM/dd")
let formattedDate = Date(timeIntervalSince1970: date.rounded())
return dateFormatter.string(from: formattedDate)
}
}
我们的想法是拥有一个日期数组,[1598409060.0, 1598409060.0]
,并通过使用索引访问它来一个一个地返回它们。记录 value
和 index
确实显示了这种情况。
问题是,虽然重复标签的数量已减少以匹配地块数量,但重复标签仍然存在:
在一个 x 轴标签“8/25”上,两个图应相互堆叠。
我正在使用 enumerated()
提取 ChartDataEntry
的索引:
var dateArr = [Double]()
for (index, fetchedMetric) in fetchedMetrics.enumerated() {
let date = fetchedMetric.date.timeIntervalSince1970
dateArr.append(date)
if var yValues = metricDict[fetchedMetric.unit] {
yValues.append(ChartDataEntry(x: Double(index), y: Double(truncating: fetchedMetric.value)))
metricDict.updateValue(yValues, forKey: fetchedMetric.unit)
} else {
metricDict.updateValue([ChartDataEntry(x: Double(index), y: Double(truncating: fetchedMetric.value))], forKey: fetchedMetric.unit)
}
}
这是因为当您设置图表设置时(粒度 = 1 和 ChartXAxisFormatter)在 xAxis 中显示每一秒
我更喜欢使用数组日期在轴上显示日期,像这样
public class DateValueFormatter: NSObject, IAxisValueFormatter {
private let dateFormatter = DateFormatter()
private let dates:[Date]
init(dates: [Date]) {
self.dates= dates
super.init()
dateFormatter.dateFormat = "dd MMM HH:mm"
}
public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
if value >= 0 && value < objects.count{
let date = dates[Int(value)]
return dateFormatter.string(from: date)
}
return ""
}
}
如果您不想更改值的格式,您可以尝试将粒度设置为 86400(1 天内的总秒数)
我正在使用 iOS Charts,并且在我的 x 轴上得到一个重复的标签。
我得到了很多答案 (first, second, third) 我应该设置粒度设置:
xAxis.granularityEnabled = true
xAxis.granularity = 1.0
但是,当我这样做时,x 轴上的标签就消失了。
我的 x 轴设置:
let xAxis = lineChartView.xAxis
xAxis.labelPosition = .bottom
xAxis.labelFont = .boldSystemFont(ofSize: 12)
xAxis.setLabelCount(6, force: false)
xAxis.labelTextColor = UIColor(red: 0, green: 0, blue: 255/255, alpha: 1.0)
xAxis.axisLineColor = UIColor(white: 0.2, alpha: 0.4)
xAxis.gridColor = UIColor(white: 0.8, alpha: 0.4)
xAxis.valueFormatter = ChartXAxisFormatter()
我创建了一个自定义 class 来根据 documentation:
的建议格式化传递到 x 轴的值class ChartXAxisFormatter: IAxisValueFormatter {
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("MM/dd")
let date = Date(timeIntervalSince1970: value)
return dateFormatter.string(from: date)
}
}
更新
感谢@aiwiguna 并在图表 repo 的帮助下,我能够创建一个包含两件事的自定义 class:日期 (Double) 和相应的索引 ( Int),而不仅仅是日期。
class ChartXAxisFormatter: NSObject, IAxisValueFormatter {
private var dates: [Double]?
convenience init(usingDates dateArr: [Double]) {
self.init()
self.dates = dateArr
}
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
print("value: \(value)")
print("dates: \(dates)")
let index = Int(value)
guard let dates = dates, index < dates.count else {
return "?"
}
let date = dates[index]
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("MM/dd")
let formattedDate = Date(timeIntervalSince1970: date.rounded())
return dateFormatter.string(from: formattedDate)
}
}
我们的想法是拥有一个日期数组,[1598409060.0, 1598409060.0]
,并通过使用索引访问它来一个一个地返回它们。记录 value
和 index
确实显示了这种情况。
问题是,虽然重复标签的数量已减少以匹配地块数量,但重复标签仍然存在:
在一个 x 轴标签“8/25”上,两个图应相互堆叠。
我正在使用 enumerated()
提取 ChartDataEntry
的索引:
var dateArr = [Double]()
for (index, fetchedMetric) in fetchedMetrics.enumerated() {
let date = fetchedMetric.date.timeIntervalSince1970
dateArr.append(date)
if var yValues = metricDict[fetchedMetric.unit] {
yValues.append(ChartDataEntry(x: Double(index), y: Double(truncating: fetchedMetric.value)))
metricDict.updateValue(yValues, forKey: fetchedMetric.unit)
} else {
metricDict.updateValue([ChartDataEntry(x: Double(index), y: Double(truncating: fetchedMetric.value))], forKey: fetchedMetric.unit)
}
}
这是因为当您设置图表设置时(粒度 = 1 和 ChartXAxisFormatter)在 xAxis 中显示每一秒
我更喜欢使用数组日期在轴上显示日期,像这样
public class DateValueFormatter: NSObject, IAxisValueFormatter {
private let dateFormatter = DateFormatter()
private let dates:[Date]
init(dates: [Date]) {
self.dates= dates
super.init()
dateFormatter.dateFormat = "dd MMM HH:mm"
}
public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
if value >= 0 && value < objects.count{
let date = dates[Int(value)]
return dateFormatter.string(from: date)
}
return ""
}
}
如果您不想更改值的格式,您可以尝试将粒度设置为 86400(1 天内的总秒数)