隐藏ggplot2中的图例元素

时间:2018-02-06 21:18:06

标签: r ggplot2 legend

我试图从stan模型输出中绘制参数估计值和层次结构级别。对于图例,我希望删除除“整体效果”标签以外的所有标签,但我无法弄清楚如何成功删除所有物种。

以下是代码:

ggplot(dfwide, aes(x=Estimate, y=var, color=factor(sp), size=factor(rndm),
                   alpha=factor(rndm))) + 
  geom_point(position =pd) + 
  geom_errorbarh(aes(xmin=(`2.5%`), xmax=(`95%`)), position=pd, 
                     size=.5, height = 0, width=0) + 
  geom_vline(xintercept=0) + 
  scale_colour_manual(values=c("blue", "red", "orangered1","orangered3", "sienna4",
                               "sienna2", "green4", "green3", "purple2", "magenta2"), 
                      labels=c("Overall Effects", expression(italic("A. pensylvanicum"), 
                               italic("A. rubrum"), italic("A. saccharum"), 
                               italic("B. alleghaniensis"), italic("B. papyrifera"), 
                               italic("F. grandifolia"), italic("I. mucronata"),
                               italic("P. grandidentata"), italic("Q. rubra")))) +
  scale_size_manual(values=c(3, 1, 1, 1, 1, 1, 1, 1, 1, 1)) + 
  scale_shape_manual(labels="", values=c("1"=16,"2"=16)) + 
  scale_alpha_manual(values=c(1, 0.4)) + guides(size=FALSE, alpha=FALSE) + 
  ggtitle(label = "A.") + 
  scale_y_discrete(limits = rev(unique(sort(dfwide$var))), labels=estimates) + 
  ylab("") + 
  labs(col="Effects") + theme(legend.title=element_blank())

enter image description here

2 个答案:

答案 0 :(得分:2)

您需要注意的关键点是, ggplot2 中的功能无法实现删除图例中的部分标签,您需要做的是与网格<进行交互/ strong>,由于 lattice ggplot2 基于网格,更多的基础,为了做更多的基础工作,我们需要一些功能的

要删除图例中的部分标签,需要使用三个功能,它们是grid.force()grid.ls()grid.remove()。通过ggplot2绘制图片,然后使用grid.force()grid.ls(),我们可以找到图片中的所有元素,它们都是点,线,文本等。然后我们可能需要找到元素我们感兴趣的是,这个过程是交互式的,因为ggplot2中元素的名称是由一些数字和文本组成的,它们并不总是有意义的,在我们确定了我们感兴趣的元素的名称后,我们可以使用{{1}删除元素的函数,自爆是我制作的示例代码。

grid.remove()

original picture

直到现在,我们已经完成了整个画面的绘制,然后我们需要做一些工作去掉图片中的一些元素。

    library(grid)
    library(ggplot2)
    set.seed(1)
    data <- data.frame(x = rep(1:10, 2), y = sample(1:100, 20),
                       type = sample(c("A", "B"), 20, replace = TRUE))

    ggplot(data, aes(x = x, y =y,color = type))+
      geom_point()+
      geom_line()+
      scale_color_manual(values = c("blue", "darkred"))+
      theme_bw()

the elements names in picture

grid.force() grid.ls() 列出所有元素名称

grid.ls()

modified picture

答案 1 :(得分:0)

它并不完美,但我的解决方案是实际制作两个图并将它们组合在一起。请参阅我提取提取代码的this post

我没有你的数据,但我想你会得到以下想法:

library(ggplot2)
library(gridExtra)
library(grid)

#g_table credit goes to https://stackoverflow.com/a/11886071/2060081

g_legend<-function(a.gplot){ 
tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
legend <- tmp$grobs[[leg]] 
return(legend)} 

p_legend = ggplot(dfwide[sp=='Overall Effects'], aes(x=Estimate, y=var, color=factor(sp), 
size=factor(rndm),
                   alpha=factor(rndm))) + 
  geom_point(position =pd) + 
  geom_errorbarh(aes(xmin=(`2.5%`), xmax=(`95%`)), position=pd, 
                     size=.5, height = 0, width=0) + 
  geom_vline(xintercept=0) + 
  scale_colour_manual(values=c("blue"), 
                      labels=c("Overall Effects"))) +
  scale_size_manual(values=c(3)) + 
  scale_shape_manual(labels="", values=c("1"=16,"2"=16)) + 
  scale_alpha_manual(values=c(1, 0.4)) + guides(size=FALSE, alpha=FALSE) + 
  ggtitle(label = "A.") + 
  scale_y_discrete(limits = rev(unique(sort(dfwide$var))), labels=estimates) + 
  ylab("") + 
  labs(col="Effects") + theme(legend.title=element_blank())

p_legend = g_legend(p_legend)

你的一个情节只是传说。根据{{​​1}}对数据进行子集化,然后将两个图一起绘制为网格。