【问题标题】:Create additional independent legends in ggplot2在 ggplot2 中创建额外的独立图例
【发布时间】:2021-04-22 19:51:58
【问题描述】:

我已经为此苦苦挣扎了好几个小时。我有以下脚本:

library(ggplot2)
sims = replicate(1000, sample(c(0,0,0,0,1,1,1,2,2,2), size=3, replace=FALSE))
df = data.frame(x=colSums(sims == 0),
                y=colSums(sims == 1))
df$count <- 1
total_counts = aggregate(count ~ ., df, FUN = sum)

min_count = min(total_counts$count)
max_count = max(total_counts$count)

p = (ggplot(df, aes(x=x, y=y))
 + geom_count(aes(color=..n.., size=..n..), alpha=0.8)
 + guides(color = 'legend', size=FALSE)
 + labs(color='Count')
 + scale_colour_gradient(limits = c(min_count, max_count), 
                         breaks = round(seq(min_count, max_count, length.out=5)),
                         labels = round(seq(min_count, max_count, length.out=5)))
+ scale_size_continuous(range = c(3, 7.5))
)

到目前为止一切顺利。问题是我想添加两组额外的点:

df2 = data.frame(x=c(0, 1, 2, 3),
                 y=c(1.5253165, 1.0291262, 0.4529617, 0))

df3 = data.frame(x=c(0, 1, 2, 3),
                 y=c(1.5, 1, 0.5, 0))

要得到这样的东西:

p2 = (p
      + geom_point(data=df2, aes(x=x, y=y), alpha=0.4, color="red", size = 2.5)
      + geom_point(data=df3, aes(x=x, y=y), alpha=0.4, color="green", size = 2.5)
)

问题是我无法将这些新点添加到图例中。我希望图例位于不同的“部分”中。即,有一个空字符串标题(以将这些点与“计数”标题区分开来),并在其标签中使用字符串而不是数字(例如,“模拟手段”和“理论手段”)。

有什么办法可以做到吗?

【问题讨论】:

  • df 似乎没有定义。
  • @Peter 抱歉,我忘了粘贴部分代码。我已经修好了,谢谢

标签: r ggplot2 plot legend


【解决方案1】:

我从@tjebo 学到的一个技巧是,您可以使用 ggnewscale 包来生成其他图例。在绘图构造的哪个点上调用新比例很重要,因此您首先要制作一个 geom/stat 图层并添加所需的比例。一旦声明了这些,您就可以使用new_scale_colour(),并且所有后续的 geom/stat 图层都将使用新的色标。

library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 4.0.5
library(ggnewscale)
#> Warning: package 'ggnewscale' was built under R version 4.0.3

sims = replicate(1000, sample(c(0,0,0,0,1,1,1,2,2,2), size=3, replace=FALSE))
df = data.frame(x=colSums(sims == 0),
                y=colSums(sims == 1))
df$count <- 1
total_counts = aggregate(count ~ ., df, FUN = sum)

min_count = min(total_counts$count)
max_count = max(total_counts$count)

df2 = data.frame(x=c(0, 1, 2, 3),
                 y=c(1.5253165, 1.0291262, 0.4529617, 0))

df3 = data.frame(x=c(0, 1, 2, 3),
                 y=c(1.5, 1, 0.5, 0))

ggplot(df, aes(x, y)) +
  geom_count(aes(colour = after_stat(n), size = after_stat(n)),
             alpha = 0.5) +
  scale_colour_gradient(
    limits = c(min_count, max_count),
    breaks = round(seq(min_count, max_count, length.out = 5)),
    labels = round(seq(min_count, max_count, length.out = 5)),
    guide  = "legend"
  ) +
  new_scale_colour() +
  geom_point(aes(colour = "Simulated means"), 
             data = df2, alpha = 0.4) +
  geom_point(aes(colour = "Theoretical means"),
             data = df3, alpha = 0.4) +
  scale_colour_discrete(
    name = ""
  ) +
  scale_size_continuous(range = c(3, 7.5), guide = "none")

reprex package (v1.0.0) 于 2021 年 4 月 22 日创建

(P.S. 很抱歉重新格式化您的代码,这样对我自己来说更容易阅读)

【讨论】:

  • 太棒了!正是我需要的,非常感谢。我已经接受了答案,因为这是一个“奖励曲目”,但是是否可以独立选择每一层的颜色和大小?我有一个奇怪的行为。例如,如果我希望“n”个点的大小范围为 3 到 8,模拟和理论分别为 2 和 1,你会怎么做?
  • 哦,是的,例如,您可以在第一个色标中设置标度 guide = guide_legend(override.aes = list(size = 3:7))。将size 列表元素的长度与您有多少断点相匹配。
猜你喜欢
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 2020-11-09
相关资源
最近更新 更多