[英]ggplot2 outside panel border when using facet
I would like to have a border around the outside of my faceted plot but not have the lines that separate the panels inside the plot. 我想在我的刻面图的外面有一个边框,但是没有用于分隔图中的面板的线条。 The issue is that panel.border draws a border around each panel in the facet with no option to just have a border around the entire plot.
问题是panel.border在facet中的每个面板周围绘制一个边框,没有选项只能在整个绘图周围有一个边框。 Alternatively can you set the inside dividing lines to 'white' but keep the outside border 'black'.
或者,您可以将内部分界线设置为“白色”,但保持外部边框“黑色”。
Here is my code: 这是我的代码:
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())
Result: Faceted plot with inside borders 结果:带有内边框的刻面图
Desired output (edited in paint): Faceted plot without inside lines 期望的输出(在绘画中编辑):没有内线的刻面图
My actual data plot that I want to remove the inside lines from looks like this: 我想删除内部行的实际数据图看起来像这样:
Two options for consideration, both making use of a secondary axis to simulate the panel border on the right side. 需要考虑两个选项,两个选项都使用辅助轴来模拟右侧的面板边框。 Use option 2 if you want to do away with the facet box outlines on top as well.
如果您想取消顶部的方面框轮廓,请使用选项2。
Option 1 : 选项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
(I'm leaving the legend in the default position as it's not critical here.) (我将传说保留在默认位置,因为它在这里并不重要。)
Option 2 is a modification of option 1, with facet outline removed & a horizontal line added to simulate the top border. 选项2是选项1的修改,删除了小平面轮廓并添加了水平线以模拟顶部边框。 Y-axis limits are set explicitly to match the height of this border:
明确设置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
Sample data used: 使用的样本数据 :
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")))
(For the record, I don't think facet_grid
/ facet_wrap
were intended for such use cases...) (对于记录,我不认为
facet_grid
/ facet_wrap
是针对此类用例...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.