叠加两个具有不同 x 和 y 轴刻度的 ggplots
Overlay two ggplots with different x and y axes scales
假设我有两个 data.frames 如下:
df_1=data.frame(x=c(1:200), y=rnorm(200))
df_2=rpois(100000, 1)
df_2=data.frame(table(df_2))
df_2$df_2=as.numeric(levels(df_2$df_2))[df_2$df_2]
当我单独绘制它们时,我得到:
library(ggplot2)
p1=ggplot() +
geom_line(data=df_1, aes(x=x,y=y))
print(p1)
p2=ggplot() +
geom_line(data=df_2, aes(x=df_2,y=Freq))
print(p2)
这两个图具有不同的 x 轴和 y 轴。
如何将两个地块叠加在一起?
谢谢
因为它们没有匹配的比例,所以 ggplot 不允许我们将它们一个接一个地绘制。 (ggplot 甚至不允许两个 y-scales)为了解决这个问题,我们必须将它们视为图像而不是绘图。
为了使图像尽可能相似,我们需要去除线条以外的所有内容。拥有轴、标签、标题等将 'misalign' "plots"。
library(ggplot2)
library(magick)
#> Linking to ImageMagick 6.9.7.4
#> Enabled features: fontconfig, freetype, fftw, lcms, pango, x11
#> Disabled features: cairo, ghostscript, rsvg, webp
df_1 <- data.frame(x=c(1:200), y=rnorm(200))
df_2 <- rpois(100000, 1)
df_2 <- data.frame(table(df_2))
df_2$df_2 <- as.numeric(levels(df_2$df_2))[df_2$df_2]
p1 <- ggplot() +
geom_line(data=df_1, aes(x=x,y=y)) +
theme_void() +
theme(
panel.background = element_rect(fill = "transparent"), # bg of the panel
plot.background = element_rect(fill = "transparent", color = NA), # bg of the plot
panel.grid.major = element_blank(), # get rid of major grid
panel.grid.minor = element_blank(), # get rid of minor grid
legend.background = element_rect(fill = "transparent"), # get rid of legend bg
legend.box.background = element_rect(fill = "transparent") # get rid of legend panel bg
)
ggsave(filename = 'plot1.png', device = 'png', bg = 'transparent')
#> Saving 7 x 5 in image
p2 <- ggplot() +
geom_line(data=df_2, aes(x=df_2,y=Freq)) +
theme_void() +
theme(
panel.background = element_rect(fill = "transparent"), # bg of the panel
plot.background = element_rect(fill = "transparent", color = NA), # bg of the plot
panel.grid.major = element_blank(), # get rid of major grid
panel.grid.minor = element_blank(), # get rid of minor grid
legend.background = element_rect(fill = "transparent"), # get rid of legend bg
legend.box.background = element_rect(fill = "transparent") # get rid of legend panel bg
)
ggsave(filename = 'plot2.png', device = 'png', bg = 'transparent')
#> Saving 7 x 5 in image
cowplot::plot_grid(p1, p2, nrow = 1)
两个地块:
plot1 <- image_read('plot1.png')
plot2 <- image_read('plot2.png')
img <- c(plot1, plot2)
image_mosaic(img)
由 reprex package (v0.3.0)
于 2020 年 1 月 10 日创建
两者 "plots" 合并:
这是另一种选择。我们可以在 scale_*_continuous()
函数中使用 sec.axis
参数,通过转换将数据映射到彼此之上。
ggplot() +
geom_line(data=df_1, aes(x=x,y=y))+
geom_line(data=df_2, aes(x=df_2*25,y=Freq/9000))+
scale_x_continuous(sec.axis = sec_axis(trans = ~./25))+
scale_y_continuous(sec.axis = sec_axis(trans = ~.*9000))
缩放是任意的,所以你可以玩到你觉得合适为止。
假设我有两个 data.frames 如下:
df_1=data.frame(x=c(1:200), y=rnorm(200))
df_2=rpois(100000, 1)
df_2=data.frame(table(df_2))
df_2$df_2=as.numeric(levels(df_2$df_2))[df_2$df_2]
当我单独绘制它们时,我得到:
library(ggplot2)
p1=ggplot() +
geom_line(data=df_1, aes(x=x,y=y))
print(p1)
p2=ggplot() +
geom_line(data=df_2, aes(x=df_2,y=Freq))
print(p2)
这两个图具有不同的 x 轴和 y 轴。
如何将两个地块叠加在一起?
谢谢
因为它们没有匹配的比例,所以 ggplot 不允许我们将它们一个接一个地绘制。 (ggplot 甚至不允许两个 y-scales)为了解决这个问题,我们必须将它们视为图像而不是绘图。
为了使图像尽可能相似,我们需要去除线条以外的所有内容。拥有轴、标签、标题等将 'misalign' "plots"。
library(ggplot2)
library(magick)
#> Linking to ImageMagick 6.9.7.4
#> Enabled features: fontconfig, freetype, fftw, lcms, pango, x11
#> Disabled features: cairo, ghostscript, rsvg, webp
df_1 <- data.frame(x=c(1:200), y=rnorm(200))
df_2 <- rpois(100000, 1)
df_2 <- data.frame(table(df_2))
df_2$df_2 <- as.numeric(levels(df_2$df_2))[df_2$df_2]
p1 <- ggplot() +
geom_line(data=df_1, aes(x=x,y=y)) +
theme_void() +
theme(
panel.background = element_rect(fill = "transparent"), # bg of the panel
plot.background = element_rect(fill = "transparent", color = NA), # bg of the plot
panel.grid.major = element_blank(), # get rid of major grid
panel.grid.minor = element_blank(), # get rid of minor grid
legend.background = element_rect(fill = "transparent"), # get rid of legend bg
legend.box.background = element_rect(fill = "transparent") # get rid of legend panel bg
)
ggsave(filename = 'plot1.png', device = 'png', bg = 'transparent')
#> Saving 7 x 5 in image
p2 <- ggplot() +
geom_line(data=df_2, aes(x=df_2,y=Freq)) +
theme_void() +
theme(
panel.background = element_rect(fill = "transparent"), # bg of the panel
plot.background = element_rect(fill = "transparent", color = NA), # bg of the plot
panel.grid.major = element_blank(), # get rid of major grid
panel.grid.minor = element_blank(), # get rid of minor grid
legend.background = element_rect(fill = "transparent"), # get rid of legend bg
legend.box.background = element_rect(fill = "transparent") # get rid of legend panel bg
)
ggsave(filename = 'plot2.png', device = 'png', bg = 'transparent')
#> Saving 7 x 5 in image
cowplot::plot_grid(p1, p2, nrow = 1)
两个地块:
plot1 <- image_read('plot1.png')
plot2 <- image_read('plot2.png')
img <- c(plot1, plot2)
image_mosaic(img)
由 reprex package (v0.3.0)
于 2020 年 1 月 10 日创建两者 "plots" 合并:
这是另一种选择。我们可以在 scale_*_continuous()
函数中使用 sec.axis
参数,通过转换将数据映射到彼此之上。
ggplot() +
geom_line(data=df_1, aes(x=x,y=y))+
geom_line(data=df_2, aes(x=df_2*25,y=Freq/9000))+
scale_x_continuous(sec.axis = sec_axis(trans = ~./25))+
scale_y_continuous(sec.axis = sec_axis(trans = ~.*9000))
缩放是任意的,所以你可以玩到你觉得合适为止。