移除ggplot分面条形图标签周围的三个边框。

4
我有以下图表:

enter image description here

我想做一个非常简单的更改:我想删除左侧标签边框线的顶部、右侧和底部。如何删除这些线条,或者绘制与右侧线条等效的线条?如果可能的话,我宁愿不使用grobs,但对任何有效的解决方案不会说不。
图形代码:
library(ggplot2)
library(dplyr)
library(forcats)

posthoc1 %>% 
  mutate(ordering = -as.numeric(Dataset) + Test.stat,
         Species2 = fct_reorder(Species2, ordering, .desc = F)) %>% 
  ggplot(aes(x=Coef, y=Species2, reorder(Coef, Taxa), group=Species2, colour=Taxa)) + 
  geom_point(size=posthoc1$Test.stat*.25, show.legend = FALSE) + 
  ylab("") + 
  theme_classic(base_size = 20) +
  facet_grid(Taxa~Dataset, scales = "free_y", space = "free_y",  switch = "y") +
  geom_vline(xintercept = 0) +
  theme(axis.text.x=element_text(colour = "black"), 
        strip.placement = "outside", 
        strip.background.x=element_rect(color = NA,  fill=NA), 
        strip.background.y=element_rect(color = "black",  fill=NA)) +
  coord_cartesian(clip = "off") +
  scale_x_continuous(limits=NULL)

数据:

structure(list(Dataset = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 5L, 5L, 5L, 5L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L), .Label = c("All.habitat", "Aut.habitat", "Habitat.season", 
"Lit.season", "Spr.habitat"), class = "factor"), Species = structure(c(1L, 
2L, 3L, 5L, 6L, 10L, 11L, 12L, 13L, 1L, 3L, 5L, 6L, 13L, 1L, 
2L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 13L), .Label = c("Ar.sp1", 
"Ar.sp2", "Arc.sp1", "B.pus", "Dal.sp1.bumps", "Dip.unID", "I.palladium", 
"Pale", "Ph.sp3", "Port", "Somethus", "sty", "Sty.sp1"), class = "factor"), 
    Species2 = structure(c(2L, 9L, 1L, 4L, 5L, 7L, 11L, 12L, 
    13L, 2L, 1L, 4L, 5L, 13L, 2L, 9L, 4L, 5L, 6L, 10L, 8L, 7L, 
    11L, 13L), .Label = c("Arcitalitrus sp1", "Armadillidae sp1 ", 
    "Brachyiulus pusillus ", "Dalodesmidae sp1", "Diplopoda", 
    "Isocladosoma pallidulum ", "Ommatoiulus moreleti ", "Philosciidae sp2", 
    "Porcellionidae sp1", "Siphonotidae sp2", "Somethus sp1", 
    "Styloniscidae ", "Styloniscidae sp1"), class = "factor"), 
    Taxa = structure(c(3L, 3L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
    1L, 2L, 2L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 3L), .Label = c("Amphipoda", 
    "Diplopoda", "Isopoda"), class = "factor"), Variable = structure(c(2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Autumn", "Litter", 
    "Spring", "Summer"), class = "factor"), Coef = c(1.911502938, 
    2.086917154, 1.571872993, 12.61184801, 15.6161116, -1.430032837, 
    -12.51944478, 12.33934516, -8.040249562, 8.08258816, 1.780142396, 
    12.88982576, 16.78107544, -13.22641153, 1.68810887, 2.093965381, 
    12.27209197, 15.08328526, -6.334640911, -11.29985948, -11.62658947, 
    -1.676293808, -6.246555908, -3.470297147), SE = c(0.403497472, 
    2.21607562, 0.348600794, 2.423896379, 0.509468128, 3.423013791, 
    2.382857733, 1.775086895, 2.087788334, 2.23631504, 0.33402261, 
    2.518562443, 0.459720131, 1.950974996, 0.2476205, 0.235648095, 
    1.815155489, 0.325804415, 2.564680067, 2.437104984, 2.212583358, 
    2.677618401, 2.324019051, 0.420436743), Test.stat = c(18.36532749, 
    13.27324683, 13.29039037, 20.50277493, 44.06097153, 10.55234932, 
    14.64951518, 13.22575401, 20.16415411, 16.55627107, 11.81407568, 
    15.15213717, 40.67205188, 12.62233207, 37.60085488, 16.90879258, 
    20.20215107, 80.30520371, 13.35250626, 13.01692428, 17.52987519, 
    20.03658771, 12.02467914, 53.5052683)), row.names = 10:33, class = "data.frame")

我假设你已经知道(因为你在代码中使用了它)facet标签边框是由element_rect()控制的,它同时控制所有四个边。如果你只想要它在一侧,通过修改grobs可以实现,但我不确定这是否会真正改善这张图表的外观... - Z.Lin
是的,我知道。这就是为什么我觉得很难的原因。这张图可能不是最好的例子,但在右侧放置一根条形图可以更清楚地显示每组物种属于哪个类别。 - Grubbmeister
1个回答

8
这个解决方案基于grobs:找到“strip-l”(左条带)的位置,然后用线条grobs替换矩形grobs。
p <- posthoc1 %>% 
  mutate(ordering = -as.numeric(Dataset) + Test.stat,
         Species2 = fct_reorder(Species2, ordering, .desc = F)) %>% 
  ggplot(aes(x=Coef, y=Species2, reorder(Coef, Taxa), group=Species2, colour=Taxa)) + 
  geom_point(size=posthoc1$Test.stat*.25, show.legend = FALSE) + 
  ylab("") + 
  theme_classic(base_size = 20) +
  facet_grid(Taxa~Dataset, scales = "free_y", space = "free_y",  switch = "y") +
  geom_vline(xintercept = 0) +
  theme(axis.text.x=element_text(colour = "black"), 
        strip.placement = "outside", 
        #strip.background.x=element_rect(color = "white",  fill=NULL), 
        strip.background.y=element_rect(color = NA)
  ) +
  coord_cartesian(clip = "off") +
  scale_x_continuous(limits=NULL)

library(grid)
q <- ggplotGrob(p)
lg <- linesGrob(x=unit(c(0,0),"npc"), y=unit(c(0,1),"npc"), 
                   gp=gpar(col="red", lwd=4))

for (k in grep("strip-l",q$layout$name)) {
  q$grobs[[k]]$grobs[[1]]$children[[1]] <- lg
}

grid.draw(q)

enter image description here


1
非常好,谢谢。实际上我想要在分类名称下面加线,所以我把代码改成了 x=unit(c(1,1),"npc"), y=unit(c(1,0),"npc")。 - Grubbmeister
1
Marco Sandri的解决方案非常有效,是澄清图形的好方法。但当轴进行切换时,我仍然难以完全理解x和y输入,但通常经过一些试错可以帮助解决问题。 只是想知道,基于这个,是否有可能省略一个或两个标签+线条,例如说我想显示它们全部,除了等足目的那条线和等足目的标签...?你有什么想法吗? - Fred-LM
1
哇,太好了,这个救了我,尽管我需要更改它以适应沿x轴的分组(我使用了“strip-b”(底部条纹)而不是“strip-l”,并相应地更改了linesGrob()中的xy)。我很确定没有其他方法可以做到这一点。太棒了,@Marco Sandri! - Brunox13

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