【问题标题】:Hide legend elements in ggplot2在ggplot2中隐藏图例元素
【发布时间】:2018-07-17 01:16:09
【问题描述】:

我正在尝试从 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())

【问题讨论】:

    标签: r ggplot2 legend


    【解决方案1】:

    需要注意的关键点是ggplot2中的功能无法实现去除legend中的部分标签,你需要做的是与grid,因为 latticeggplot2 都是基于 grid 的,所以更底层,为了做一些更底层的工作,我们需要在网格

    要删除图例中的部分标签,需要使用三个函数,它们是grid.force()grid.ls()grid.remove()。用ggplot2画完图,然后用grid.force()grid.ls(),我们就可以找到图中所有的元素,都是点、线、文字等。那么我们可能需要找到我们感兴趣的元素,这个过程是交互的,因为ggplot2中的元素名称是由一些数字和文字组成的,它们并不总是有意义的,在我们识别出我们感兴趣的元素的名称之后,我们可以使用grid.remove()函数来删除元素,自爆是我做的示例代码。

        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()
    

    到目前为止,我们已经完成了整个画面的绘制,接下来我们需要做一些工作,移除画面中的一些元素。

        grid.force()
        grid.ls()
    

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

        grid.remove("key-4-1-1.5-2-5-2")
        grid.remove("key-4-1-2.5-2-5-2")
        grid.remove("label-4-3.5-4-5-4")
    

    【讨论】:

    • 当我尝试在 ggplot 对象上使用网格函数时,我收到一个错误,指出它是无效的强制目标(使用 grid.force())函数。此外,当我在没有任何参数的情况下运行这些函数时,它们会在没有任何错误的情况下执行,但它也不会返回任何有关基础信息的信息。
    【解决方案2】:

    这并不完美,但我的解决方案是实际制作两个图并将它们组合在一起。请参阅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)

    你的情节之一就是传奇。根据Overall Effects 对数据进行子集化,然后将这两个图绘制成一个网格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2022-01-02
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多