【问题标题】:Bounding position for geom_text()geom_text() 的边界位置
【发布时间】:2020-04-29 19:12:28
【问题描述】:

我正在制作几个倾斜条形图的实例。由于计数的大小和百分比的差异会发生变化,因此在某些情况下,其中一个标签(计数)的一部分会被推到条形之外。在所有情况下,我都需要标签完全位于栏内。如果没有重新定位以适应条形图,我需要将标签按原样居中。

代码是:

library(tidyverse)
library(ggplot2)

data <- tibble(type = c('Cat', 'Dog'),
               group = c('Pets', 'Pets'),
               count = c(10000, 990000),
               percent = c(1, 99))

ggplot(data, aes(x = group, y = percent, fill = type)) +
  geom_bar(stat = 'identity', 
           position = position_stack(reverse = TRUE)) +
  coord_flip() +
  geom_text(aes(label = count),
            position = position_stack(vjust = 0.5, 
                                      reverse = TRUE))

【问题讨论】:

  • 对我来说,无论数值如何,图表都可以...您的 R 和 ggplot2 版本是什么?
  • @Jrm_FRL:R 版本 3.6.2 和 ggplot2 版本 3.2.1。
  • 您可以绘制以千为单位的计数(带有说明这一点的标题),然后您需要绘制 10 和 990 而不是 10,000 和 990,000。无论如何,由于两端的条形段占条形长度的百分比不到百分之几,您可能无法在绘图面板中获得整个数字。

标签: r ggplot2 geom-text


【解决方案1】:

使用hjust="inward":

ggplot(data, aes(x = group, y = percent, fill = type)) +
  geom_bar(stat = 'identity', position = position_stack(reverse = TRUE)) +
  coord_flip() +
  geom_text(aes(label = count), hjust = "inward", position = position_stack(vjust = 0.5, reverse = TRUE))

【讨论】:

  • 我应该注意到990000 稍微偏左一点。为了解决这个问题,我们需要手动分配hjust= 一些(可能很简单)启发式。
  • 太棒了!我希望存在这样的环境。您是否大致了解将 990000 居中的启发式算法是什么样的?
  • 我误读了轴和意图(在涉及coord_flip() 时对我来说很常见:-)。 “向内移动但只有在字符太宽的情况下”的问题让我感到困惑。抱歉,我什么都没想到。
【解决方案2】:

这里要注意的一点是ggplot 中的绘图根据图形设备的分辨率、宽度和高度设置而有所不同。这就是为什么绘图看起来有点不同的原因,具体取决于您用来绘制它们的计算机。如果我采用您的默认图表并保存不同的纵横比,这将变得很明显:

  • width=3, height=5

  • width=7, height=5

纵横比和分辨率会改变情节。您也可以通过调整绘图查看器窗口的大小在 R Studio 中亲自查看。

话虽如此,有一些选项可以调整您的绘图,以减少超出范围的文本剪辑:

  • 旋转文本或将绘图旋转回水平条。对于长文本标签,无论如何,它们会更好地使用水平条。

  • geom_text_repel 来自 ggrepel 包。直接替换geom_text 会将您的标签放在绘图区域中,您可以使用min.segment.length= 指定最小行长以及force=direction= 来进行定位。同样,如果您翻转图表,效果会更好。

  • 使用应用于scale_y_continuousexpand= 参数。例如,尝试将scale_y_continuous(expand=c(0.25,0.25)) 添加到您的情节中。请注意,由于您的坐标系被翻转,您必须指定“y”来扩展“x”。这会扩大几何图形周围的绘图区域。

  • 在导出绘图时更改输出 width=height= 和分辨率。如上所述,这是一个简单的解决方案。

可能还有其他建议,但这是我的建议。

【讨论】:

    猜你喜欢
    • 2018-03-04
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多