有两种选择,都利用辅助轴来模拟右侧的面板边框。如果您还希望取消顶部的方格框轮廓,请使用选项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, "-")},
sec.axis = dup_axis(breaks = 0)) +
scale_fill_grey() +
facet_grid(~Season, scales = "free_x", space = "free_x") +
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_rect(size = 0.5))
(因为这里的图例不是必要的,所以我将其保留在默认位置。)
选项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)) +
scale_fill_grey() +
facet_grid(~Season, scales = "free_x", space = "free_x") +
coord_cartesian(ylim = c(y.lower.limit, y.upper.limit)) +
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())
使用的样本数据:
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
并非用于此类情况……)
+ theme_minimal()
吗?它看起来很像你想要的样子。 - bdemarest