小设备上饼图标签重叠问题

3

我在当前项目中使用了以下库来显示饼图:https://github.com/danielgindi/Charts

但是,在iPhone小屏幕设备上,我遇到了饼图显示的问题。我已经实现了以下代码来显示饼图:

class ChartVC: UIViewController {

    @IBOutlet weak var pieChartView : PieChartView!

    var arrPiChartData : [PiChartData]?

    func setupPiChart() {

        let l = pieChartView.legend
        l.horizontalAlignment = .right
        l.verticalAlignment = .bottom
        l.orientation = .vertical
        l.xEntrySpace = 0
        l.yEntrySpace = 0
        l.yOffset = 0
        l.font = self.isPhone ? Typography.robotoRegular14 : Typography.robotoRegular18

        self.pieChartView.entryLabelFont = Typography.robotoRegular14
        self.pieChartView.drawHoleEnabled = false
        self.pieChartView.notifyDataSetChanged()
    }

    func setupData() {

        var arr = [PieChartDataEntry]()

        if self.arrPiChartData != nil {

            for piChartData in self.arrPiChartData! {

                var name = ""
                if let strName = piChartData.name {
                    name = strName
                }

                var value = 0.0
                if let floatValue = piChartData.percentAmount {
                    value = Double(floatValue)
                }

                let entry = PieChartDataEntry(value: value, label: name)
                arr.append(entry)
            }

            let set = PieChartDataSet(values: arr, label: "Total Sales by Company Users")
            set.drawIconsEnabled = false
            set.sliceSpace = 2
            set.xValuePosition = .outsideSlice
            set.entryLabelColor = UIColor.black
            set.entryLabelFont = self.isPhone ? Typography.robotoRegular14 : Typography.robotoRegular18

            set.colors = self.arrColours

            let data = PieChartData(dataSets: [set])

            let pFormatter = NumberFormatter()
            pFormatter.numberStyle = .percent
            pFormatter.maximumFractionDigits = 1
            pFormatter.multiplier = 1
            pFormatter.percentSymbol = " %"
            data.setValueFormatter(DefaultValueFormatter(formatter: pFormatter))

            self.pieChartView.data = data

        } else {
            self.pieChartView.data = nil
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setupPiChart()
        self.setupData()
    }

    //------------------------------------------------------------------------------

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.pieChartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0)
    }
}

这段代码用于显示饼图。但是当我在像iPhone SE、5S、6、7、8这样的小设备上运行应用程序时,会出现问题。标签数据重叠到了饼图上。

请查看以下图片,它将描述实际问题。

Pie chart display issue in iPhone SE, 5S

我尝试过寻找解决方案,但没有找到。
我需要帮助来解决这个问题或者提供更好的解决方案。

1
使用水平方向怎么样?我认为PieChart不像其他图表那样缩放,因此您可能需要为iPhone尺寸明确设置高度。或者使用图例的水平方向。 - Kamran
如果名称不是有限的,您不应在此处使用饼图。相反,您可以使用条形图显示百分比。 - TheTiger
2
@MayurKarmur 从技术上讲,如果不重叠标签,不可能将100个用户的数据显示在饼图中。想象一下,你只有一个圆形,0.4%,0.5%的数据会产生线条,这些线条可能小于1像素,那么在这种情况下,你该如何显示标题呢?你能做的最多就是改变交替标题标签的X位置,使它们呈现出锯齿状的模式。 - TheTiger
1
正如@TheTiger所说,如果您有5-10个以上的条目,最好使用其他图表。6度角不像柱状图上的6个像素那样可见。如果您正在显示图例,则可以禁用显示valueLinePart/xAxisLabels - Kamran
关于饼图中的百分比显示,这并不是一个问题,因为我们无法控制它。 - Mayur Karmur
显示剩余7条评论
1个回答

1

由于在饼图中垂直显示更多图例的方法不太好,因此我已更新代码以水平方向显示。另外,在饼图中标题无法正确显示,因此将其删除。为此,我已更新代码如下以显示正确的饼图:

func setupPiChart() {

    // This will align label text to top right corner
    let l = pieChartView.legend
    l.horizontalAlignment = .left
    l.verticalAlignment = .bottom
    l.orientation = .horizontal
    l.xEntrySpace = 10
    l.yEntrySpace = 0
    l.font = self.isPhone ? Typography.robotoRegular14 : Typography.robotoRegular18

    self.pieChartView.entryLabelFont = Typography.robotoRegular14
    self.pieChartView.drawHoleEnabled = false
    self.pieChartView.drawEntryLabelsEnabled = false
    self.pieChartView.notifyDataSetChanged()
}

现在,它的显示效果如下图所示:

Pie chart legends display horizontally


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接