You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:18:12