当使用facet时,ggplot2如何设置图形外面的面板边框?

10

我希望在我的分面图的外部有一个边框,但是不想让分面内部的线条出现。问题在于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())

结果:内边界的多面绘图

在这里输入图片描述

期望输出(在Paint中编辑):没有内部线条的分面绘图

在这里输入图片描述

我实际上想要删除内部线条的数据图看起来像这样:

需要移除内边界的实际数据图


我不确定这个例子与您的实际用例有多接近,但是一旦您移除内部线条,您从facets中获得了什么?是顶部的标签吗?还是圆柱体组之间微小的空间? - aosmith
@aosmith 抱歉,我提供了这个例子来简化事情,但我的实际数据看起来像我刚刚编辑的那样。内部线条的问题在于它们在更连续的时间序列数据集中提供了细分(即它们强调了一个我不想要如此明显定义的“季节”细分)。此外,当我将panel.spacing设置为0时,内部线比外部线更粗,因为它会两次绘制facet边框 - 一次是左侧facet的右边框,一次是中心facet的左边框等等。 - Guidofish
不如避免全部使用facet,而是在图表内添加“湿”和“干”的标签怎么样? - aosmith
我更想知道如何解决这个问题。我真的很喜欢使用facets,但是我需要在出版物中围绕图形加上边框。奇怪的是,似乎没有一种简单的方法来控制外部边框与其他边框分开。 - Guidofish
@Guidofish,你能提供一个类似于你实际使用情况的样本数据集/代码吗?我有一个想法,但我不想根据mtcars示例来完善它,因为那个图表看起来非常不同。 - Z.Lin
你试过 + theme_minimal() 吗?它看起来很像你想要的样子。 - bdemarest
1个回答

8

有两种选择,都利用辅助轴来模拟右侧的面板边框。如果您还希望取消顶部的方格框轮廓,请使用选项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

选项1

(因为这里的图例不是必要的,所以我将其保留在默认位置。)

选项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

选项2

使用的样本数据:

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并非用于此类情况……)

谢谢 @Z.Lin。我曾考虑过使用第二个Y轴,但是无法使其正常工作。再次感谢。 - Guidofish

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