我有一个类似于以下内容的用例,我创建多个图并使用gridExtra
将它们排列成某个页面布局,最后将其保存为带有ggsave
的PDF:
p1 <- generate_ggplot1(...)
p2 <- generate_ggplot2(...)
final <- gridExtra::arrangeGrob(p1, p2, ...)
ggplot2::ggsave(filename=output.file,plot=final, ...)
使用p2
将地图arrangeGrob
安排到页面布局中是否可以裁剪p2
?问题是cropping
在它的顶部和底部有很多额外的空间,我想摆脱它,因为ggplot2
使用{{library(ggplot2); library(dplyr); library(stringr); library(gridExtra)
df <- data.frame(group = c("Cars", "Trucks", "Motorbikes"),n = c(25, 25, 50),
label2=c("Cars are blah blah blah", "Trucks some of the best in town", "Motorbikes are great if you ..."))
df$ymax = cumsum(df$n)
df$ymin = cumsum(df$n)-df$n
df$ypos = df$ymin+df$n/2
df$hjust = c(0,0,1)
p1 <- ggplot(mtcars,aes(x=1:nrow(mtcars),y=mpg)) + geom_point()
p2 <- ggplot(df %>%
mutate(label2 = str_wrap(label2, width = 10)), #change width to adjust width of annotations
aes(x="", y=n, fill=group)) +
geom_rect(aes_string(ymax="ymax", ymin="ymin", xmax="2.5", xmin="2.0")) +
expand_limits(x = c(2, 4)) + #change x-axis range limits here
# no change to theme
theme(axis.title=element_blank(),axis.text=element_blank(),
panel.background = element_rect(fill = "white", colour = "grey50"),
panel.grid=element_blank(),
axis.ticks.length=unit(0,"cm"),axis.ticks.margin=unit(0,"cm"),
legend.position="none",panel.spacing=unit(0,"lines"),
plot.margin=unit(c(0,0,0,0),"lines"),complete=TRUE) +
geom_text(aes_string(label="label2",x="3",y="ypos",hjust="hjust")) +
coord_polar("y", start=0) +
scale_x_discrete()
final <- arrangeGrob(p1,p2,layout_matrix = rbind(c(1),c(2)),
widths=c(4),heights=c(4,4), padding=0.0,
respect=TRUE, clip="on")
plot(final)
似乎不可行1}}只有我在想,也许可以在安排时裁剪它......
更新以下是我的用例的一个独立示例,我想通过任何方式摆脱注释为红色的区域:
let curT = -22;
const letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
let result = {};
for (let i=0; i < 52; i++) {
const letNum = `${letters[i % 7]}${(parseInt(i / 7) + 1)}`;
result[`t${curT}`] = letNum;
curT += 1;
}
console.log(result);
输出是:
答案 0 :(得分:1)
为此,需要一个多部分解决方案。
首先,要更改单个图形中的边距,在theme()中使用plot.margin是一种方便的方法。但是,如果目标是组合多个图表,那么单凭这个问题就不会解决问题。
要做到这一点,你需要在arrangeGrob()中组合plot.margin和特定的绘图顺序。您需要一个特定的订单,因为绘图按您调用的顺序打印,因此,更改位于其他绘图后面而不是绘图前面的绘图边距会更容易。我们可以把它想象成覆盖我们想要缩小的绘图边距,方法是将绘图扩展到我们想要缩小的绘图之上。请参见下图:
在plot.margin设置之前:
#Main code for the 1st graph can be found in the original question.
在plot.margin设置之后:
#Main code for 2nd graph:
ggplot(df %>%
mutate(label2 = str_wrap(label2, width = 10)),
aes(x="", y=n, fill=group)) +
geom_rect(aes_string(ymax="ymax", ymin="ymin", xmax="2.5", xmin="2.0")) +
geom_text(aes_string(label="label2",x="3",y="ypos",hjust="hjust")) +
coord_polar(theta='y') +
expand_limits(x = c(2, 4)) +
guides(fill=guide_legend(override.aes=list(colour=NA))) +
theme(axis.line = element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank(),
axis.text.y=element_blank(),
axis.text.x=element_blank(),
panel.border = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "white"),
plot.margin = unit(c(-2, 0, -2, -.1), "cm"),
legend.position = "none") +
scale_x_discrete(limits=c(0, 1))
结合plot.margin设置和arrangeGrob()重新排序后:
#Main code for 3rd graph:
p1 <- ggplot(mtcars,aes(x=1:nrow(mtcars),y=mpg)) + geom_point()
p2 <- ggplot(df %>%
mutate(label2 = str_wrap(label2, width = 10)), #change width to adjust width of annotations
aes(x="", y=n, fill=group)) +
geom_rect(aes_string(ymax="ymax", ymin="ymin", xmax="2.5", xmin="2.0")) +
geom_text(aes_string(label="label2",x="3",y="ypos",hjust="hjust")) +
coord_polar(theta='y') +
expand_limits(x = c(2, 4)) + #change x-axis range limits here
guides(fill=guide_legend(override.aes=list(colour=NA))) +
theme(axis.line = element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank(),
axis.text.y=element_blank(),
axis.text.x=element_blank(),
panel.border = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "white"),
plot.margin = unit(c(-2, 0, -2, -.1), "cm"),
legend.position = "none") +
scale_x_discrete(limits=c(0, 1))
final <- arrangeGrob(p2,p1,layout_matrix = rbind(c(1),c(2)),
widths=c(4),heights=c(2.5,4),respect=TRUE)
请注意,在最终代码中,我将arrangeGrob中的顺序从p1,p2转换为p2,p1。然后我调整了绘制的第一个对象的高度,这是我们想要缩小的高度。此调整允许较早的plot.margin调整生效,并且当生效时,最后按顺序打印的图形(即P1)将开始占用P2边距的空间。如果您使用其他调整进行其中一项调整,解决方案将无法正常工作。这些步骤中的每一步对于产生上述最终结果都很重要。