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

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


使用Charts,我的折线图将每个数据点以一个单位填充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
    }


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

最佳答案

与其直接传递数据点,不如将数据点转换为将所有相关的天数包含为x值(1天间隔,即使该天没有关联的y值),并在它们存在的位置适当地填充y值。


建立每天包含1个元素的x值数组
如果当天有值,则将值添加到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创建X轴,而不是每个数据点每天1个单位,而是每天1个单位?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38113719/

10-11 02:36
查看更多