可以将图例大小设置为自动吗? (ggplot2)

Posted

技术标签:

【中文标题】可以将图例大小设置为自动吗? (ggplot2)【英文标题】:Possible to set legend size to auto? (ggplot2) 【发布时间】:2020-09-20 17:07:36 【问题描述】:

我在 ggplot 中显示图例时遇到问题。我的数据每天都在变化,有时我有大约 20 个数据点,有时只有 5 个数据点。

图例超出了图表的限制。但始终将其绘制成低比例并不是一个好的选择。

这是一个情节:

require(data.table)
require(ggplot2)

df <- data.table(name = c("A12345678901234567890", "B12345678901234567890", "C12345678901234567890", "D12345678901234567890", "E12345678901234567890", "F12345678901234567890", "G12345678901234567890", "H12345678901234567890", "I12345678901234567890"), val = runif(n = 9))

plotcolors <- rainbow(df[,.N, by = name][,.N], end = 0.65)
p <- ggplot(data = df)
p <- p + 
  scale_fill_manual(values = plotcolors) + 
  aes(x = name, y = val, fill = name) +
  theme(axis.text.x=element_blank(), legend.position = "bottom", text = element_text(size = 10), legend.text = element_text(size = 10), legend.title = element_text(size = 10), plot.margin = margin(10, 10, 10, 10, "pt")) + 
  xlab(NULL) +
  scale_y_continuous()
p <- p + geom_bar(stat = "identity", colour = "black")

print(p)

在方形画布上输出它会将图例写入范围之外。 是否可以创建一种自动缩放?


2020 年 6 月 8 日更新:

剧情是这样的:

曲线的数量不同。所以图例改变了,我需要手动调整大小。我可能会通过计算每个元素的字符来计算大小,并尝试估计可能的缩放比例。不过如果 ggplot2 自己做就好了。

【问题讨论】:

【参考方案1】:

据我所知,ggplot 中不存在这样的图例自动缩放。使图更大(通过 ggsave 或仅通过使设备更大)可以帮助将图例适合图。

但是在此处给出的示例中,正确标记 x 轴会更容易,因为您将相同的变量映射到 x 并填充。您实际上并不需要fill,但您仍然可以添加它,最好不要添加图例。

如果你还想修改图例的布局,可以去guide_legend()看看,不过这里确实不是这样。

library(data.table)
library(ggplot2)


set.seed(42)
df <- data.table(name = c("A12345678901234567890", "B12345678901234567890", "C12345678901234567890", "D12345678901234567890", "E12345678901234567890", "F12345678901234567890", "G12345678901234567890", "H12345678901234567890", "I12345678901234567890"), val = runif(n = 9))

# Simple version
ggplot(df) + 
  geom_bar(aes(name, val), stat = "identity") + 
  theme(axis.text.x = element_text(angle = 90))

# Version with fill also mapped to name
ggplot(df) + 
  geom_bar(aes(name, val, fill = name), stat = "identity") + 
  theme(axis.text.x = element_text(angle = 90),
        legend.position = "none")

【讨论】:

其实稍微复杂一点。每个栏分为更多子类别。我没有在示例中显示它,以免使其更加混乱。我正在考虑完全改变图表,也许是树状图。 子组有超大图例?如果您提供了更新的示例,我可以看看它

以上是关于可以将图例大小设置为自动吗? (ggplot2)的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2:顶部图例键符号大小随图例键标签而变化

ggplot2-图例篇

ggplot2 - 在大小图例中显示多个键(形状)

使用 ggplot2 在 R 中保持一致的图形大小(图例和轴改变大小)

如何在ggplot2的图例中斜体化一个类别

增加图例字体大小ggplot2