如何在ggplot2双面板图中仅对指定面板应用对数Y轴
解决办法:只给指定面板设对数Y轴
针对你要做的——绘制人均GDP(gdppc)和增长率(growthRate=diff(log(gdppc)))的双面板图,只给gdppc面板用对数Y轴,增长率面板保留线性Y轴,下面给你两种实用的实现方式:
方法一:用ggh4x给分面面板单独设轴
如果你是用ggplot2的分面功能(比如facet_wrap)做的双面板图,可以用ggh4x包的工具单独给某个面板配置轴转换,不用改整体逻辑:
先装包加载包
install.packages("ggh4x") library(ggplot2) library(ggh4x)
整理示例数据(替换成你自己的数据集即可)
set.seed(123) year <- 2000:2020 gdppc <- exp(cumsum(rnorm(length(year), 0.05, 0.02))) growthRate <- diff(log(gdppc)) # 整理成分面需要的长格式 df <- data.frame( year = c(year, year[-1]), value = c(gdppc, growthRate), variable = rep(c("gdppc", "growthRate"), c(length(year), length(year)-1)) )
绘图并单独设置轴转换
ggplot(df, aes(x = year, y = value)) + geom_line() + # 分面时放开Y轴限制,允许两个面板使用不同轴刻度 facet_wrap(~variable, scales = "free_y", ncol = 1) + # 单独给gdppc面板设log10转换,增长率面板用默认线性轴 facetted_pos_scales( y = list( variable == "gdppc" ~ scale_y_continuous(trans = "log10"), variable == "growthRate" ~ scale_y_continuous() ) ) + labs(x = "年份", y = "")
方法二:画两个独立图再拼接(更直白易上手)
要是不想装新包,直接绘制两个独立的子图,再用patchwork拼接起来,每个图可以单独设置轴属性,新手也能快速搞定:
装包加载包
install.packages("patchwork") library(ggplot2) library(patchwork)
分别绘图后拼接
# 绘制gdppc图,直接设置对数Y轴 p1 <- ggplot(data.frame(year, gdppc), aes(x = year, y = gdppc)) + geom_line() + scale_y_continuous(trans = "log10", name = "人均GDP(对数刻度)") + labs(x = "") # 绘制增长率图,使用默认线性Y轴 p2 <- ggplot(data.frame(year = year[-1], growthRate), aes(x = year, y = growthRate)) + geom_line() + scale_y_continuous(name = "增长率(线性刻度)") + labs(x = "年份") # 垂直拼接两个图 p1 / p2
问题根源说明
你之前的代码会给两个面板都加log10转换,是因为直接在scale_y_continuous()中设置trans='log10'时,这个配置会作用于所有分面面板。上面两种方法要么针对单个面板单独配置轴,要么拆分绘图各自设置,完美解决这个问题。
内容的提问来源于stack exchange,提问作者Spencer Graves
相关产品推荐
相关产品推荐

