水平条形图标签

Posted

技术标签:

【中文标题】水平条形图标签【英文标题】:Horizontal Bar Chart Labels 【发布时间】:2017-05-26 16:19:54 【问题描述】:

我最近将我的一个客户项目从 Swift2ios-charts 2 升级到了 Swift3 和 iOS-charts 3。

经过几天的手动调整,大部分代码都按预期运行,但是,我的水平条形图仍然存在问题。

图表曾显示为:

图表现在显示为:

图表核心代码:

func drawMarginChart() 
    let labels = marginObject!.getLabelsForChart()
    let values = marginObject!.getValuesForChart()

    var dataEntries = [ChartDataEntry]()

    for i in 0..<values.count 
        let entry = BarChartDataEntry(x: Double(i), y: values[i])
        dataEntries.append(entry)
    

    let barChartDataSet = BarChartDataSet(values: dataEntries, label: "")
    barChartDataSet.drawValuesEnabled = false
    barChartDataSet.colors = ChartColorTemplates.joyful()

    let barChartData = BarChartData(dataSet: barChartDataSet)
    barChartMargins.data = barChartData
    barChartMargins.legend.enabled = false

    barChartMargins.xAxis.valueFormatter = IndexAxisValueFormatter(values: labels)
    barChartMargins.xAxis.granularityEnabled = true
    barChartMargins.xAxis.granularity = 1

    barChartMargins.animate(xAxisDuration: 3.0, yAxisDuration: 3.0, easingOption: .easeInOutBounce)

我希望知道的是:

1) 如何让标签显示在图表上的每个条形图上

2) 如何让图表自动调整大小以显示标签

如果可以解决这些其他问题,那就太好了,但我们愿意在没有这些问题的情况下发货:

1) 如何去除图表左侧的网格线重叠?

2) 如何防止图表底部被截断?

我已经尝试调整我在此处和其他网站上找到的每个帖子的许多图表属性,但是没有任何解决问题的方法。我和我的客户将非常感谢它使图表看起来像旧版本的任何帮助。

【问题讨论】:

【参考方案1】:

我测试了一下,发现当有 8 个值和标签时,一切正常。当有 9 个或更多值和标签时,只显示一半的标签。您可以使用以下方法设置屏幕可见值的数量:

 barChartMargins.setVisibleXRange(minXRange: 8.0, maxXRange: 8.0)

这意味着如果您有比 maxXRange 更多的值,图表将是可滚动的。

通过使用此代码进行缩放,您将看到所有标签:

 barChartMargins.zoom(scaleX: 1.1, scaleY: 1.0, x: 0, y: 0)

通过左右缩放,您将看到所有标签在某些情况下出现,但不是全部(在您的情况下不是 10 个标签)。但是,如果您首先将 maxXRange 设置为 8 并像我在示例中那样允许滚动,它会起作用。 这是我使用的完整代码(用 iPhone 5 和 6Plus 测试),最后一行解决了截断问题:

 func drawMarginChart() 

    let values = [1000, 2000, 3000, 5000, 7000, 8000, 15000, 21000, 22000, 35000]
    let labels = ["Blue Yonder Airlines", "Aaron Fitz Electrical", "Central Communications", "Magnificent Office Images", "Breakthrough Telemarke", "Lawrence Telemarketing", "Vancouver Resort Hotels", "Mahler State University", "Astor Suites", "Plaza One"]



    var dataEntries = [ChartDataEntry]()

    for i in 0..<values.count 
        let entry = BarChartDataEntry(x: Double(i), y: Double(values[i]))

        dataEntries.append(entry)
    

    let barChartDataSet = BarChartDataSet(values: dataEntries, label: "")
    barChartDataSet.drawValuesEnabled = false
    barChartDataSet.colors = ChartColorTemplates.joyful()

    let barChartData = BarChartData(dataSet: barChartDataSet)
    barChartMargins.data = barChartData
    barChartMargins.legend.enabled = false

    barChartMargins.xAxis.valueFormatter = IndexAxisValueFormatter(values: labels)
    barChartMargins.xAxis.granularityEnabled = true
    barChartMargins.xAxis.granularity = 1

    barChartMargins.animate(xAxisDuration: 3.0, yAxisDuration: 3.0, easingOption: .easeInOutBounce)

    barChartMargins.chartDescription?.text = ""


    barChartMargins.zoom(scaleX: 1.1, scaleY: 1.0, x: 0, y: 0)

    let rightAxis = barChartMargins.rightAxis
    rightAxis.drawGridLinesEnabled = false

    let leftAxis = barChartMargins.leftAxis
    leftAxis.drawGridLinesEnabled = false

    let xAxis = barChartMargins.xAxis
    xAxis.drawGridLinesEnabled = false
    barChartMargins.setVisibleXRange(minXRange: 8.0, maxXRange: 8.0)

    barChartMargins.setExtraOffsets (left: 0, top: 20.0, right:0.0, bottom: 20.0)




顺便说一句。我没有遇到标签在屏幕之外的问题,但这可能与图表视图的大小和约束有关,或者可能需要使用 barChartMargins.zoom 进行更多缩放

【讨论】:

以上是关于水平条形图标签的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签

R语言ggplot2可视化绘制分组水平条形图并在条形图的各种位置添加数值标签实战

R语言ggplot2可视化彩色水平条形图并基于条形长度和数值标签长度自定义最优化配置标签在条形内部或者条形外部

R语言ggplot2可视化:ggplot2可视化水平堆叠条形图并且在每个堆叠条形图的内部居中添加百分比文本标签信息

R语言ggplot2可视化水平条形图(horizontal bar plot)并且在条形图的条形上添加数值标签( Customizing labels on bars in barplot)

R语言ggplot2可视化水平条形图(horizontal bar plot)设置水平条形图的轴文本标签左对齐(axis lables left align in horizontal bar)