使用ggside时左侧侧边图与主图间距异常问题求助
问题描述
使用ggside绘制主图为等高线图,同时在左侧y轴和顶部x轴添加谱图。初始绘图效果符合预期,但添加scale_xsidey_continuous(expand = c(0.1, 0.1))和scale_ysidey_continuous(expand = c(0.1, 0.1))扩展侧边图刻度范围后,左侧侧边图与主图之间的间距变大;而当y轴侧边图位于右侧时,该操作不会引发此问题,求解决方法。
原始代码
rm(list = ls(all = TRUE)) if (!require("ggplot2")) install.packages("ggplot2") if (!require("ggside")) install.packages("ggside") # set theme theme_set( theme(axis.line = element_blank(), axis.ticks = element_line(color = "black", size = 0.5, linetype = 1), plot.title = element_text(color = "black", size = 18, hjust = 0, vjust = 2), axis.title = element_text(color = "black", size = 16), axis.text = element_text(color = "black", size = 14), plot.tag = element_text(color = "black", size = 28), axis.ticks.length = unit(5, "pt"), plot.margin = margin(0.25, 0.25, 0.25, 0.25, "cm"), panel.border = element_rect(color = "black", size = 1, linetype = 1, fill = NA), panel.background = element_blank(), panel.grid = element_blank(), legend.title = element_blank(), legend.text = element_text(color = "black", size = 14), legend.text.align = 0.5, legend.background = element_rect(color = "transparent", fill = "white"), legend.key = element_rect(color = "transparent", fill = "white"), legend.margin = margin(5, 5, 5, 5, "pt"))) # contour set.seed(230727) z.1 <- runif(n = 100, min = -5, max = 20) x.1 <- y.1 <- seq(1, length(z.1)/10, 1) tmp <- expand.grid(x.1, y.1) x.1 <- tmp[,1] y.1 <- tmp[,2] df.1 <- data.frame(x = x.1, y = y.1) df.1$z <- z.1 df.1$level <- as.numeric(df.1$z) # line plot y.2 <- cbind(runif(n = length(z.1)/10, min = -5, max = 20), runif(n = length(z.1)/10, min = -5, max = 20)) x.2 <- seq(1, NROW(y.2), 1) df.2 <- data.frame(x = x.2, y = y.2) # plot data ggplot(df.1, aes(x = x, y = y)) + geom_contour(aes(z = z, color = after_stat(level))) + labs(x = expression(tilde(nu)[1] / cm^{-1}), y = expression(tilde(nu)[2] / cm^{-1}), tag = "A") + scale_x_continuous(expand = c(0,0)) + scale_y_continuous(expand = c(0,0), position = "right") + theme( plot.tag.position = c(0.05, 0.95), legend.position = "bottom", legend.direction = "horizontal", legend.key.size = unit(0.5, "cm"), legend.key.width = unit(2,"cm"), aspect.ratio = 1) + ggside(x.pos = "top", y.pos = "left") + geom_xsideline(data = df.2, aes(x = x, y = y.1)) + geom_ysideline(data = df.2, aes(x = y.2, y = x), orientation = "y") + theme(ggside.panel.scale = 0.125, ggside.axis.text = element_blank(), ggside.axis.ticks = element_blank())
解决方法
问题根源是对左侧yside图的scale设置错误,且默认面板间距放大了问题。按以下步骤修改:
- 修正scale设置:对于左侧yside图,使用
scale_ysidex_continuous而非scale_ysidey_continuous来设置扩展范围。因为左侧yside图的x轴对应其自身的水平方向(与主图y轴平行),设置该scale的expand参数只会扩展侧边图的垂直范围,不会影响与主图的水平间距。 - 消除默认间距:添加
ggside.panel.spacing.x = unit(0, "pt")来移除侧边图与主图之间的默认间距。
修改后的完整代码:
rm(list = ls(all = TRUE)) if (!require("ggplot2")) install.packages("ggplot2") if (!require("ggside")) install.packages("ggside") # set theme theme_set( theme(axis.line = element_blank(), axis.ticks = element_line(color = "black", size = 0.5, linetype = 1), plot.title = element_text(color = "black", size = 18, hjust = 0, vjust = 2), axis.title = element_text(color = "black", size = 16), axis.text = element_text(color = "black", size = 14), plot.tag = element_text(color = "black", size = 28), axis.ticks.length = unit(5, "pt"), plot.margin = margin(0.25, 0.25, 0.25, 0.25, "cm"), panel.border = element_rect(color = "black", size = 1, linetype = 1, fill = NA), panel.background = element_blank(), panel.grid = element_blank(), legend.title = element_blank(), legend.text = element_text(color = "black", size = 14), legend.text.align = 0.5, legend.background = element_rect(color = "transparent", fill = "white"), legend.key = element_rect(color = "transparent", fill = "white"), legend.margin = margin(5, 5, 5, 5, "pt"))) # contour set.seed(230727) z.1 <- runif(n = 100, min = -5, max = 20) x.1 <- y.1 <- seq(1, length(z.1)/10, 1) tmp <- expand.grid(x.1, y.1) x.1 <- tmp[,1] y.1 <- tmp[,2] df.1 <- data.frame(x = x.1, y = y.1) df.1$z <- z.1 df.1$level <- as.numeric(df.1$z) # line plot y.2 <- cbind(runif(n = length(z.1)/10, min = -5, max = 20), runif(n = length(z.1)/10, min = -5, max = 20)) x.2 <- seq(1, NROW(y.2), 1) df.2 <- data.frame(x = x.2, y = y.2) # plot data ggplot(df.1, aes(x = x, y = y)) + geom_contour(aes(z = z, color = after_stat(level))) + labs(x = expression(tilde(nu)[1] / cm^{-1}), y = expression(tilde(nu)[2] / cm^{-1}), tag = "A") + scale_x_continuous(expand = c(0,0)) + scale_y_continuous(expand = c(0,0), position = "right") + theme( plot.tag.position = c(0.05, 0.95), legend.position = "bottom", legend.direction = "horizontal", legend.key.size = unit(0.5, "cm"), legend.key.width = unit(2,"cm"), aspect.ratio = 1) + ggside(x.pos = "top", y.pos = "left") + geom_xsideline(data = df.2, aes(x = x, y = y.1)) + geom_ysideline(data = df.2, aes(x = y.2, y = x), orientation = "y") + # 正确设置侧边图的扩展范围 scale_xsidey_continuous(expand = c(0.1, 0.1)) + scale_ysidex_continuous(expand = c(0.1, 0.1)) + theme(ggside.panel.scale = 0.125, ggside.axis.text = element_blank(), ggside.axis.ticks = element_blank(), # 消除左侧侧边图与主图的额外间距 ggside.panel.spacing.x = unit(0, "pt"))
内容的提问来源于stack exchange,提问作者Excelsior
相关产品推荐
相关产品推荐

