如何正确使用facet_wrap中的标签?

12

我有以下图表,希望把分面绘图的标签设置成“lbl”中的内容 =

> lbl
[1] "0% - 10%"  "10% - 20%"

如何将labeller添加到facet_wrap中以显示文本,labeller如何正确处理从labeller函数输出的排序?即,如果我有20个图,labeller如何正确地按照顺序标记这些图?谢谢。

以下是代码:

x = c( rep(c(1,2,3,4,5),4)  )
group = c( rep(c(10,10,10,10,10),2),rep(c(20,20,20,20,20),2) )
lbl = paste0(  c("0%", paste0(   unique(group)[1:(length(unique(group))-1)]   ,"%" )  ) 
               ," - ",
               paste0(unique(group),"%"))
lbl
value = rnorm(20)
dat = data.frame( x= x , group  = group, value = value)
dat = dat %>% # create the mu, sd, q1 and q3 aggregates
  group_by(group,x)  %>%  
  summarise(mu =  round(mean(value),2), 
            sd= sqrt(round(sd(value),2)), 
            Q1 = quantile(value)[2],
            Q3 = quantile(value)[4],
            count = n())
dat
dat2 = dat %>%  gather (key = Metric, value= Value,c(mu, sd, Q1, Q3)) #melt the data
as.data.frame(dat2)
ggplot(data=dat2 , aes(x=x, y=Value, group = Metric,colour = Metric,linetype = Metric)) + 
  geom_line()  + geom_point() + ylab("value") + 
  xlab("v") + 
  scale_x_discrete(breaks = c( seq(1,5,1)  ) ) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  scale_y_continuous(breaks = c( seq(-3,3,.25)  )  ) +
  scale_colour_manual(values=c(mu = "blue", sd = "blue", Q1 = "red", Q3 = "red")) +
  scale_linetype_manual(values =c(mu = "dashed", sd= "solid", Q1 = "solid", Q3 = "solid"))  +
  facet_wrap(~ group, scales = "free",ncol=3) +
  theme(strip.text.x = element_text(size=10, angle=0),
        strip.text.y = element_text(size=12, face="bold"),
        strip.background = element_rect(colour="red", fill="#CCCCFF"))
1个回答

7

你只需要构建一个标记器; 阅读 ?labeller 和这里的 ?as_labeller 获取帮助。在 facet_wrap 上,你真正需要添加的是 labeller = as_labeller(setNames(lbl, sort(unique(group))))(或按照你想要的方式构建的合适命名的向量):

ggplot(data=dat2 , aes(x=x, y=Value, group = Metric,colour = Metric,linetype = Metric)) + 
  geom_line()  + geom_point() + ylab("value") + 
  xlab("v") + 
  scale_x_discrete(breaks = c( seq(1,5,1)  ) ) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  scale_y_continuous(breaks = c( seq(-3,3,.25)  )  ) +
  scale_colour_manual(values=c(mu = "blue", sd = "blue", Q1 = "red", Q3 = "red")) +
  scale_linetype_manual(values =c(mu = "dashed", sd= "solid", Q1 = "solid", Q3 = "solid"))  +
  facet_wrap(~ group, scales = "free",ncol=3, 
      # add a labeller here:
      labeller = as_labeller(setNames(lbl, sort(unique(group))))) +
  theme(strip.text.x = element_text(size=10, angle=0),
        strip.text.y = element_text(size=12, face="bold"),
        strip.background = element_rect(colour="red", fill="#CCCCFF"))

plot with proper facet labels


1
但是,setNames(lbl, unique(group)) 如何确保标签的顺序和绘图的顺序相同呢? - user3022875
刚才编辑过加入了 sort。如何构建命名向量并不重要;通常你会直接从值编程构建标签,但这里你已经创建了一个标签向量,所以我就直接使用了它。 - alistaire
我无法重现那个错误。复制我的代码会给你带来这个错误吗?通常这个错误意味着某些东西在错误的位置。 - alistaire
1
是的,当我用你的代码替换ggplot()时,我明白了。你能把包括lbl和所有内容的完整代码发出来吗? - user3022875
facet_wrap() 函数上的 autosense 不显示 labeller 参数,所以我可能使用的是过时的 ggplot 2 版本? - user3022875
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接