已编辑:这是一个调试 video也是。
我用这个library在我的 Swift iOS 应用程序中显示图表。这是我的图表:
X 轴代表日期,Y 轴代表我的运动员举起的重量。
您看到的图表中间的海蓝点是日期和举重之间的交叉点。但我不确定图表如何显示两个相同的日期和日期中间的一个点。
我的问题是如何设置 X 轴以将 Aug 23 也移动到屏幕中间或适合一个点我不在乎它是否移动,我只想显示一个点同一行日期。如下图所示:
想法是在所有点下显示日期,而不是灵活的 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/