ios - Swift 图表库。如何在正确的位置显示 X 轴日期

标签 ios swift charts mpandroidchart ios-charts

已编辑:这是一个调试 video也是。

我用这个library在我的 Swift iOS 应用程序中显示图表。这是我的图表:

enter image description here

X 轴代表日期,Y 轴代表我的运动员举起的重量。

您看到的图表中间的海蓝点是日期和举重之间的交叉点。但我不确定图表如何显示两个相同的日期和日期中间的一个点。

我的问题是如何设置 X 轴以将 Aug 23 也移动到屏幕中间或适合一个点我不在乎它是否移动,我只想显示一个点同一行日期。如下图所示:

enter image description here

想法是在所有点下显示日期,而不是灵活的 X 轴,后者现在显示一个日期之间的某个时间范围。

这是我的代码,如您所见,我循环我的结果并从中创建日期列表和 Y 轴的总提升重量。从 dateValue.timeIntervalSince1970

检索日期
func setupGraphicWithResults(_ results: [ExerciseSetResult]) {

        var oneRMValuesList = [Double]()
        var dateList = [Int]()

        for exerciseResult in prepareResults(results) {           
            let oneRMValue = ExeciseResultsService().calculateOneRMValueForResult(exerciseResult)
            let formattedOneRMValue = UnitMeasurementService().convertWeightValueToCurrentMeasurementUnit(oneRMValue)
            oneRMValuesList.append(formattedOneRMValue)

            let dateValue = exerciseResult.date.formatStringToDate()
            let dateInt = dateValue.timeIntervalSince1970
            dateList.append(Int(dateInt))
        }

        setChart(datePoints: dateList, values: oneRMValuesList)
    }


func setChart(datePoints: [Int], values: [Double]) {

        let yAxis = chartView.leftAxis
        yAxis.labelFont = UIFont.mainAppFont(11)
        yAxis.setLabelCount(5, force: true)
        yAxis.labelTextColor = .white
        yAxis.labelPosition = .outsideChart
        yAxis.axisLineColor = .stackedTipTextColor
        yAxis.granularity = 5.0
        yAxis.granularityEnabled = true
        yAxis.drawGridLinesEnabled = true
        yAxis.drawAxisLineEnabled = false

        let xAxis = chartView.xAxis
        xAxis.labelFont = UIFont.mainAppFont(11)
        xAxis.labelTextColor = .white
        xAxis.labelPosition = .bottom
        xAxis.drawAxisLineEnabled = false
        xAxis.drawGridLinesEnabled = false
        xAxis.setLabelCount(datePoints.count, force: true)
        xAxis.valueFormatter = DateValueFormatter()
        xAxis.yOffset = 20.0

        chartView.rightAxis.enabled = false
        chartView.legend.enabled = false
        chartView.chartDescription?.enabled = false
        chartView.setExtraOffsets(left: 10, top: 0, right: 20, bottom: 0)

        var dataEntries: [ChartDataEntry] = []

        for i in 0..<values.count {
            let dataEntry = ChartDataEntry(x: Double(datePoints[i]), y: values[i])
            dataEntries.append(dataEntry)
        }

        let lineChartDataSet = LineChartDataSet(entries: dataEntries, label: "")

        lineChartDataSet.mode = .cubicBezier
        lineChartDataSet.drawCirclesEnabled = true
        lineChartDataSet.lineWidth = 2.8
        lineChartDataSet.circleRadius = 4
        lineChartDataSet.circleHoleRadius = 3.8
        lineChartDataSet.circleHoleColor = .stackedLightBlue
        lineChartDataSet.setCircleColor(.white)
        lineChartDataSet.highlightColor = .stackedLightBlue
        //lineChartDataSet.fillColor = .stackedLightBlue
        //lineChartDataSet.fillAlpha = 0.2
        lineChartDataSet.drawFilledEnabled = true
        lineChartDataSet.drawHorizontalHighlightIndicatorEnabled = false
        lineChartDataSet.drawVerticalHighlightIndicatorEnabled = false

        let gradientColors = [UIColor.stackedLightBlue.cgColor, UIColor.clear.cgColor] as CFArray // Colors of the gradient
        let colorLocations:[CGFloat] = [1.0, 0.0] // Positioning of the gradient
        let gradient = CGGradient.init(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: gradientColors, locations: colorLocations) // Gradient Object
        lineChartDataSet.fill = Fill.fillWithLinearGradient(gradient!, angle: 90.0)

        let lineChartData = LineChartData(dataSet: lineChartDataSet)

        lineChartData.setDrawValues(false)
        chartView.data = lineChartData
    }

最佳答案

我怀疑您的日期值(整数,自 1970 年以来的秒数)具有非零小时/分钟/秒组件。我建议您截断时间部分,使时间始终为 00:00:00。然后,我会改变你的 X 轴的基数以在几天内工作。您可以将每个 x 值除以 24。这样,X 轴上的每个整数都等于一天。

要恢复 X 轴的正确时间格式,您可以更新 DateFormatter() 类并将该值乘以 24:

public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
    var date = Date(timeIntervalSince1970: value * 24)
    let format = dateFormatter.string(from: date)
    return format
}

还将您的 x 轴粒度设置为 1,以便显示每一天。

另外,请注意时区。当您将时间截断为 0 时,您可能需要加回小时数,以便您的时间在本地时区为 00:00:00 - DateFormatter 正在根据时区进行格式化。

关于ios - Swift 图表库。如何在正确的位置显示 X 轴日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57828172/

相关文章:

ios - 使用界面构建器来布局带有图像和文本的 ScrollView

ios - 配置文件与应用程序标识符权利的权利文件的值不匹配

swift - 如何改变图像的大小?图像未填充

ios - Xcode 7 + swift 。 "Use of local variable ' _' before its declaration"错误

ios - "Cannot invoke ' CGPointMake ' with an argument list of type ' ((), CGFloat) '"在 Swift 中收到

ios - WKWebView媒体控件标题显示Url

ios - swift "Specialized"崩溃

javascript - 在for循环中创建多个图表

javascript - canvasJS 图表无法正确渲染

JavaFX 折线图 : Insert new data in the middle of the chart