【问题标题】:Automatically leave enough room for a label next to a barplot自动为条形图旁边的标签留出足够的空间
【发布时间】:2023-01-13 00:11:15
【问题描述】:

我正在用 ggplot2 制作水平条形图,标签位于条形右侧。我是否要为标签留出足够的空间,以免它们从图表上掉下来?

这个问题之前已经被问过很多次了,但我的问题是关于自动地,这意味着无需手动调整条形图旁边的空间即可为标签留出足够的空间。

用例是一个闪亮的应用程序,其中:

  • 我们不知道条的宽度提前
  • 我们不知道文本标签的长度
  • 我们不知道文本大小

例子:

library(ggplot2)

data <- data.frame(
  weight = c("short","longer label","medium lab"),
  speed = sample(50:150,3)
)

ggplot(data, aes(x = weight, y = speed, label = weight)) +
  coord_flip(clip = 'off') +
  theme_minimal() +
  geom_bar(stat = "identity") + 
  geom_text(hjust = -0.1, size = 4) +
  ylim(c(0, 1.07 * max(data$speed)))

重新运行代码,你会看到标签有时会从右边的图表上掉下来)。

到目前为止,我的解决方案“有点”有效,是为 ylim 乘数(此处为 1.07)提供一些估算器,以留出足够的空间。我当然可以使用一个非常高的值,但是我们创建了太多的空白。

我还尝试通过 grid::grobWidth 计算 grob 的宽度,主要基于这篇文章: How can I access dimensions of labels plotted by `geom_text` in `ggplot2`?

然而,为了使用这种方法计算文本(或其他)元素的实际大小,我们需要知道gpar 中的cex,但我们在geom_text 中只有一个size 参数。我看不出它们有什么关系(?)。

我还查看了ggprepel 及其内部代码,但无法理解如何将他们的方法应用于这个特定问题。

非常感谢任何帮助/指点!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    一种选择是使用 在标签中创建中断以节省空间,如下所示:

    library(ggplot2)
    
    data <- data.frame(
      weight = c("short","longer label","medium lab"),
      speed = sample(50:150,3)
    )
    
    data$weight2 <- sub("\s", "
    ", data$weight)
    
    ggplot(data, aes(x = weight, y = speed, label = weight2)) +
      coord_flip(clip = 'off') +
      theme_minimal() +
      geom_bar(stat = "identity") + 
      geom_text(hjust = -0.1, size = 4) +
      ylim(c(0, 1.07 * max(data$speed)))
    

    创建于 2023-01-12 reprex v2.0.2

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 2013-11-16
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多