gpt4 book ai didi

swift - 如何使用 Swift Charts 创建每天 1 个单位而不是每个数据点 1 个单位的 x 轴?

转载 作者:行者123 更新时间:2023-11-30 13:17:01 26 4
gpt4 key购买 nike

我有一个采用时间序列数据的图表。时间序列数据每天最多记录一次,但不定期记录。即,数据可能如下所示:

1/1, 1500
1/13, 1600
1/14, 1700
2/22, 1800
5/1, 1400

使用图表,我的折线图用每个数据点一个单位填充 x 轴(即,在上面的示例中,x 轴上有 5 个单位,而不是 ~120 天)

如何为范围内的所有日期创建带有单位的 x 轴?

我的图表的代码:

    func setChartData(data: ([String], [Double])) {
var yVals1 = [ChartDataEntry]()
for i in 0 ..< data.0.count {
yVals1.append(ChartDataEntry(value: data.1[i], xIndex: i))
}

let set1: LineChartDataSet = LineChartDataSet(yVals: yVals1, label: nil)
set1.axisDependency = .Left

set1.setColor(UIColor(red:0.502, green:0.580, blue:0.784, alpha:1.000))
set1.lineWidth = 2.0
set1.fillAlpha = 1
set1.fillColor = UIColor(red:0.502, green:0.580, blue:0.784, alpha:1.000)
set1.highlightColor = UIColor.whiteColor()
set1.drawValuesEnabled = false
set1.drawCirclesEnabled = false
set1.drawFilledEnabled = true


var dataSets : [LineChartDataSet] = [LineChartDataSet]()
dataSets.append(set1)

let data: LineChartData = LineChartData(xVals: data.0, dataSets: dataSets)
data.setValueTextColor(UIColor.whiteColor())

let legend = lineChartView.legend
legend.enabled = false

let xAxis = lineChartView.xAxis
xAxis.drawGridLinesEnabled = false
xAxis.drawAxisLineEnabled = false
xAxis.labelPosition = .Bottom

let rightAxis = lineChartView.rightAxis
rightAxis.drawAxisLineEnabled = false
rightAxis.drawLabelsEnabled = false
rightAxis.drawGridLinesEnabled = false

let leftAxis = lineChartView.leftAxis
leftAxis.drawAxisLineEnabled = false
leftAxis.gridColor = UIColor.blackColor().colorWithAlphaComponent(0.1)
leftAxis.gridLineWidth = 2


self.lineChartView.data = data
}

Here is a screenshot of the graph in my app.

最佳答案

不要直接传递数据点,而是将数据点转换为包含所有相关日期作为 x 值(1 天间隔,即使该天没有关联的 y 值)并适当填写 y 值,其中它们存在。

  1. 构建每天包含 1 个元素的 x 值数组
  2. 如果当天有值,则将该值添加到 y 值数组中。否则将 nil 添加到 y 值数组。

代码:

struct StatsViewModel {

var exercise: Exercise

var workoutDates: ([String], [Double?]) {
if let lastWorkout = exercise.workoutDiary.last, firstWorkout = exercise.workoutDiary.first {
var dates = [String]()
var stats = [Double?]()
let ti:NSTimeInterval = 24*60*60 //one day
let dateFrom = firstWorkout.date
let dateTo = lastWorkout.date

var nextDate = dateFrom
let endDate = dateTo.dateByAddingTimeInterval(ti)

while nextDate.compare(endDate) == NSComparisonResult.OrderedAscending
{
dates.append(nextDate.myPrettyString)
let workout = exercise.workoutDiary.filter { $0.date.myPrettyString == nextDate.myPrettyString }.first
if let workout = workout {
stats.append(Double(workout.totalVolume))
} else {
stats.append(nil)
}
nextDate = nextDate.dateByAddingTimeInterval(ti)
}
return (dates, stats)
}
return ([], [])
}
}

根据上面生成的数据点创建 ChartDataEntry,占空:

var statsViewModel: StatsViewModel!

override func viewDidLoad() {
setChartData(statsViewModel.workoutDates)
}

func setChartData(data: ([String], [Double?])) {
var yVals1 = [ChartDataEntry]()
for i in 0 ..< data.0.count {
if let yval = data.1[i] {
yVals1.append(ChartDataEntry(value: yval, xIndex: i))
}
}
let set1: LineChartDataSet = LineChartDataSet(yVals: yVals1, label: nil)
var dataSets : [LineChartDataSet] = [LineChartDataSet]()
dataSets.append(set1)

let data: LineChartData = LineChartData(xVals: data.0, dataSets: dataSets)
data.setValueTextColor(UIColor.whiteColor())
...
}

关于swift - 如何使用 Swift Charts 创建每天 1 个单位而不是每个数据点 1 个单位的 x 轴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38113719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com