将数据标签的位置更改为ios图表中线条的底部

时间:2019-10-26 01:06:19

标签: ios swift charts mpandroidchart ios-charts

我在swift上使用了这个库:iOS图表https://github.com/danielgindi/ios-charts

我有两个数据集,我想将数据集之一中的数据标签的位置设置到行的底部,这样数字就可以看到并且不会发生重叠。我该怎么办?

enter image description here

我将图表设置如下:

private func configureChart() {
    lineChartView = LineChartView(frame: CGRect(x: 0, y: 60, width: self.view.frame.width, height: 200))

    lineChartView?.delegate = self

    lineChartView?.chartDescription?.enabled = false
    lineChartView?.dragEnabled = true
    lineChartView?.setScaleEnabled(false)
    lineChartView?.pinchZoomEnabled = false
    lineChartView?.rightAxis.enabled = false

    lineChartView?.xAxis.valueFormatter = self
    lineChartView?.xAxis.granularity = 1

    lineChartView?.legend.form = .line

    lineChartView?.animate(yAxisDuration: 0.3)

    if let lineChartView = lineChartView {
        dashboardHeaderView?.subviews.filter({ $0 is LineChartView }).forEach {
            $0.removeFromSuperview()
        }
        dashboardHeaderView?.addSubview(lineChartView)
    }
    setupLineChartData()
}

func setupLineChartData() {
    monthData = ReportModel.monthlyOveralInfo()
    let costSet = self.provideLineData(type: .totalCost)
    let incomeSet = self.provideLineData(type: .totalIncome)

    let lineChartData = LineChartData(dataSets: [incomeSet, costSet])
    lineChartView?.data = lineChartData
    lineChartView?.setVisibleXRangeMaximum(5)
    lineChartView?.moveViewToX(lineChartView?.chartXMax ?? 0)
}

private func provideLineData(type: SWMonthlyOverallType) -> LineChartDataSet {
    var mainColor: UIColor = .black
    var gradientFirstColor: UIColor = .clear
    var gradientSecondColor: UIColor = .black
    if type == .totalIncome {
        mainColor = .myAppGreen
        gradientFirstColor = .clear
        gradientSecondColor = .myAppGreen
    }

    let totalCosts = monthData.compactMap({
        $0.items.first(where: {$0.type == type})
    })

    var index: Double = -1
    let values: [ChartDataEntry] = totalCosts.compactMap({
        index += 1
        return ChartDataEntry(x: index, y: $0.value)
    })

    let chartDataSet = LineChartDataSet(values: values, label: type.rawValue)
    chartDataSet.resetColors()
    chartDataSet.drawIconsEnabled = false

    chartDataSet.setColor(mainColor)
    chartDataSet.setCircleColor(mainColor)
    chartDataSet.lineWidth = 1
    chartDataSet.circleRadius = 3
    chartDataSet.drawCircleHoleEnabled = true
    chartDataSet.valueFont = .systemFont(ofSize: 9)

    let gradientColors = [gradientFirstColor.cgColor,
                          gradientSecondColor.cgColor]
    let gradient = CGGradient(colorsSpace: nil, colors: gradientColors as CFArray, locations: nil)

    chartDataSet.fillAlpha = 0.5
    if let gradient = gradient {
        chartDataSet.fill = Fill(linearGradient: gradient, angle: 90)
    }
    chartDataSet.drawFilledEnabled = true

    return chartDataSet
}

1 个答案:

答案 0 :(得分:1)

只是发布,以防有​​人发现它有用:

chart.xAxis.labelPosition = .bottom