【问题标题】:How do I get separate legends for separate layers in ggplot?如何在 ggplot 中为单独的图层获取单独的图例?
【发布时间】:2015-11-03 16:58:52
【问题描述】:

我有一个大致类似于 df 的数据框,如下所示。它接近我所需要的,但一个图例正在打印所有四个原始分组类别,而不仅仅是两个。下面,我想有一个图例反映 df1 的“红色”和“蓝色”分组类别的线条,然后有一个单独的图例反映“绿色”和“橙色”分组类别的线条

我的动机有两个。首先,我想创建一个图,显示可以为在线出版物提供颜色并为印刷版本提供黑白信息。其次,我的真实数据集有 5 个分组类别,实际上只有两个(红色和蓝色)信息量最大。

因此,我试图在下面复制的解决方案是挑选红色和蓝色,使这些线条变粗,更改线条的线型并将它们设为红色和蓝色。然后我想添加第二层和其他信息较少的类别,使它们更薄,并通过线型改变它们。谢谢。

test<-rep(c('red', 'blue', 'green', 'orange'), 6)
test1<-rnorm(24, mean=10, sd=2)
test2<-seq(1,24,2)
df<-data.frame(test, test1, test2)
df1<-subset(df, test=='red'|test=='blue')
df2<-subset(df, test!='red'&test!='blue')

library(ggplot2)
test.plot <- ggplot(df1, aes(x=test2, y=test1, group=test)) + geom_line(aes(col=test,linetype=test), size=2) + scale_color_manual(values=c('red'='red3', 'blue'='darkblue'))
test.plot + geom_line(data=df2, aes(x=test2, y=test1, linetype=test))

【问题讨论】:

  • 但是您想要单独的图例还是一个图例?

标签: r ggplot2 layer


【解决方案1】:

通常,代表同一事物的图形方面需要位于同一图例中。这能解决您的问题吗?它使用三种手动刻度(颜色、线型和尺寸)将所有测试放在一个图例中,并带有一条特定的、可识别的线。

library(grid) #for unit
library(ggplot2)

#make proper factor levelling in data, easier than setting breaks
df$test <- factor(df$test, levels=c("blue","red","green","orange"))

#plot with a lot of manual scales (but no second sets)
p2 <- ggplot(df, aes(x=test2,y=test1, group=test, col=test)) +
   geom_line(aes(linetype=test,size=test)) +
   scale_color_manual(values=c('red'='red3','blue'='darkblue','green'='black','orange'='black')) +
   scale_linetype_manual(values=c('red'='dashed','blue'='solid','green'='dashed','orange'='dotted')) +
   scale_size_manual(values=c('red'=2,'blue'=2,'green'=0.5,'orange'=0.5)) +
   theme(legend.key.width=unit(3,"lines")) #to show dashes in red
p2

使用的数据 (seed=123):

df <- structure(list(test = structure(c(2L, 1L, 3L, 4L, 2L, 1L, 3L, 
4L, 2L, 1L, 3L, 4L, 2L, 1L, 3L, 4L, 2L, 1L, 3L, 4L, 2L, 1L, 3L, 
4L), .Label = c("blue", "red", "green", "orange"), class = "factor"), 
    test1 = c(8.87904870689557, 9.53964502103344, 13.1174166282982, 
    10.1410167828492, 10.2585754703219, 13.4301299737666, 10.9218324119784, 
    7.46987753078693, 8.62629429621295, 9.10867605980008, 12.4481635948789, 
    10.7196276541147, 10.8015429011881, 10.2213654318902, 8.88831773049185, 
    13.5738262736062, 10.9957009564585, 6.06676568674072, 11.4027118031274, 
    9.05441718454413, 7.86435258802631, 9.56405017068341, 7.94799110338552, 
    8.54221754141772), test2 = c(1, 3, 5, 7, 9, 11, 13, 15, 17, 
    19, 21, 23, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23)), .Names = c("test", 
"test1", "test2"), row.names = c(NA, -24L), class = "data.frame")

【讨论】:

  • 这很好用,但奇怪的是 theme(legend.key.width=unit(3, 'lines') 参数给了我错误:“找不到功能单元”
  • 知道了。答案是加载库(网格)
猜你喜欢
  • 2012-09-14
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多