我想在多面情节的外部周围有一个边框,但没有将情节内部的面板分开的线。问题是panel.border在构面上的每个面板周围绘制了一个边框,没有选择仅在整个图上有一个边框。或者,您可以将内部分隔线设置为“白色”,但将外部边界保持为“黑色”。

这是我的代码:

mtcars
mtcars$manufacturer=rownames(mtcars)
ggplot(mtcars, aes(x=manufacturer, y=mpg,fill=factor(gear,levels=c("3","4","5"))))+
  geom_bar(stat="identity",position="dodge",colour="black")+
  facet_grid(~cyl,scales = "free_x",space = "free_x",) +
  theme(axis.text.x = element_text(angle = 45,size=12,colour="Black",vjust=1,hjust=1),
    strip.background = element_blank(),
    strip.placement = "inside",
    strip.text = element_text(size=15),
    legend.position=c(0.9,0.8),
    legend.title=element_blank(),
    legend.text=element_text(size=15),
    panel.spacing = unit(0.2, "lines"),
    panel.background=element_rect(fill="white"),
    panel.border=element_rect(colour="black",size=1),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank())

结果:带有内部边界的多面图

r - 使用facet时,ggplot2在面板边框外部-LMLPHP

所需的输出(用油漆编辑):不带内线的多面图

r - 使用facet时,ggplot2在面板边框外部-LMLPHP

我想要从中删除内部线条的实际数据图如下所示:

r - 使用facet时,ggplot2在面板边框外部-LMLPHP

最佳答案

需要考虑的两个选项均使用辅助轴来模拟右侧的面板边框。如果您也想取消顶部的构面框轮廓,请使用选项2。

选项1 :

ggplot(df,
       aes(x = Month, y = Abundance, fill = Type)) +
  geom_col(position = "dodge", colour = "black") +
  scale_y_continuous(labels = function(x){paste(x, "-")},    # simulate tick marks for left axis
                     sec.axis = dup_axis(breaks = 0)) +      # add right axis
  scale_fill_grey() +
  facet_grid(~Season, scales = "free_x", space = "free_x") +
  theme_classic() +
  theme(axis.title.y.right = element_blank(),                # hide right axis title
        axis.text.y.right = element_blank(),                 # hide right axis labels
        axis.ticks.y = element_blank(),                      # hide left/right axis ticks
        axis.text.y = element_text(margin = margin(r = 0)),  # move left axis labels closer to axis
        panel.spacing = unit(0, "mm"),                       # remove spacing between facets
        strip.background = element_rect(size = 0.5))         # match default line size of theme_classic

r - 使用facet时,ggplot2在面板边框外部-LMLPHP

(我将图例保留在默认位置,因为此处并不重要。)

选项2 是对选项1的修改,其中删除了构面轮廓,并添加了一条水平线以模拟顶部边框。明确设置Y轴限制以匹配此边框的高度:
y.upper.limit <- diff(range(df$Abundance)) * 0.05 + max(df$Abundance)
y.lower.limit <- 0 - diff(range(df$Abundance)) * 0.05

ggplot(df,
       aes(x = Month, y = Abundance, fill = Type)) +
  geom_col(position = "dodge", colour = "black") +
  geom_hline(yintercept = y.upper.limit) +
  scale_y_continuous(labels = function(x){paste(x, "-")},    #
                     sec.axis = dup_axis(breaks = 0),        #
                     expand = c(0, 0)) +                     # no expansion from explicitly set range
  scale_fill_grey() +
  facet_grid(~Season, scales = "free_x", space = "free_x") +
  coord_cartesian(ylim = c(y.lower.limit, y.upper.limit)) +  # set explicit range
  theme_classic() +
  theme(axis.title.y.right = element_blank(),                #
        axis.text.y.right = element_blank(),                 #
        axis.ticks.y = element_blank(),                      #
        axis.text.y = element_text(margin = margin(r = 0)),  #
        panel.spacing = unit(0, "mm"),                       #
        strip.background = element_blank())                  # hide facet outline

r - 使用facet时,ggplot2在面板边框外部-LMLPHP

使用的示例数据:
set.seed(10)
df <- data.frame(
  Month = rep(c("Jun 14", "Aug 14", "Oct 14", "Dec 14", "Apr 15", "Jun 15"),
             each = 3),
  Type = rep(c("Mangrove", "Mudflat", "Fringe"), 6),
  Season = rep(c("Dry1", rep("Wet1", 3), rep("Dry2", 2)), each = 3),
  Abundance = sample(50:600, 18)
)

df <- df %>%
  mutate(Month = factor(Month, levels = c("Jun 14", "Aug 14", "Oct 14",
                                          "Dec 14", "Apr 15", "Jun 15")),
         Season = factor(Season, levels = c("Dry1", "Wet1", "Dry2")))

(根据记录,我不认为facet_grid/facet_wrap用于此类用例...)

关于r - 使用facet时,ggplot2在面板边框外部,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46220242/

10-13 07:45
查看更多