Я пытаюсь выровнять два графика, линейный график и гистограмму, но ось немного смещена. Можете ли вы порекомендовать способы в ggplot2 или patchwork или другом пакете фасетных сюжетов. Спасибо
воспроизводимый код
data<-data.frame(
Gains=c(NA,18.26,27.7,13.09,-8.36,1.73,5.57,17.1,-31.31,5.43,38.97,18.81,6.12,1.85,NA,16.28,21.18,3.44,-0.14,-3.87,10.57,11.942,-2.12,-0.07,33.34,13.66,14.14,30.66,NA,17.7,24.286,14.638,-7.986,0.622,9.265,3.216,-30.509,4.714,37.78,17.842,11.606,12.188),
Site=c(67,66,61,60,58,57,55,52,48,44,42,39,33,24.5,67,66,61,60,58,57,55,52,48,44,42,39,33,24.5,67,66,61,60,58,57,55,52,48,44,42,39,33,24.5),
Discharge=c(0,18.26,52.16,65.25,56.89,58.62,64.4,81.5,50.19,55.62,94.59,129.37,146.87,154.17,0,16.28,43.09,46.53,46.39,42.52,53.3,65.242,39.46,39.39,72.73,98.21,112.35,143.01,0,17.7,49.266,63.904,55.918,57.67,67.155,78.255,47.746,52.46,90.24,125.092,141.84,162.68)
)
a<-ggplot(data, aes(x=Site, y=Discharge,))+
stat_summary(geom = "ribbon", fun.min = min, fun.max = max, alpha = 0.25) +
stat_summary(geom = "linerange", fun.min = min, fun.max = max, alpha = 0.3) +
stat_summary(geom = "line", fun = mean, size=1.2) +
geom_point(aes(y = Discharge)) +
annotate("rect", xmin = 60, xmax = 57, ymin = -Inf, ymax = Inf,
alpha = .08)+
annotate("rect", xmin = 52, xmax = 44, ymin = -Inf, ymax = Inf,
alpha = .08)+
scale_y_continuous(n.breaks=10)+
scale_x_reverse(n.breaks=10)+
xlab("River Mile")+
ylab("Discharge (cfs)")
b<-ggplot(data, aes(x=Site, y=Gains,))+
stat_summary(geom = "bar", fun = mean)+
#stat_summary(geom = "errorbar",fun.min = min, fun.max = max, alpha = 0.3)+
annotate("rect", xmin = 60, xmax = 57, ymin = -Inf, ymax = Inf,
alpha = .08)+
annotate("rect", xmin = 52, xmax = 44, ymin = -Inf, ymax = Inf,
alpha = .08)+
scale_x_reverse(breaks=seq(20,80,5))+
scale_y_continuous(breaks=seq(-30,50,10))+
ylab("Gain and Loss (cfs)")+
xlab("River Mile")
pwrk<- b/a
pwrk + plot_layout(heights = c(1,2))
Вы можете добавить coord_cartesian(xlim=c(70,20))
к каждому сюжету, и это сработает. Вы можете изменить значения xlim по своему усмотрению, если они одинаковы на обоих графиках.
library(ggplot2)
library(patchwork)
data<-data.frame(
Gains=c(NA,18.26,27.7,13.09,-8.36,1.73,5.57,17.1,-31.31,5.43,38.97,18.81,6.12,1.85,NA,16.28,21.18,3.44,-0.14,-3.87,10.57,11.942,-2.12,-0.07,33.34,13.66,14.14,30.66,NA,17.7,24.286,14.638,-7.986,0.622,9.265,3.216,-30.509,4.714,37.78,17.842,11.606,12.188),
Site=c(67,66,61,60,58,57,55,52,48,44,42,39,33,24.5,67,66,61,60,58,57,55,52,48,44,42,39,33,24.5,67,66,61,60,58,57,55,52,48,44,42,39,33,24.5),
Discharge=c(0,18.26,52.16,65.25,56.89,58.62,64.4,81.5,50.19,55.62,94.59,129.37,146.87,154.17,0,16.28,43.09,46.53,46.39,42.52,53.3,65.242,39.46,39.39,72.73,98.21,112.35,143.01,0,17.7,49.266,63.904,55.918,57.67,67.155,78.255,47.746,52.46,90.24,125.092,141.84,162.68)
)
a<-ggplot(data, aes(x=Site, y=Discharge,))+
stat_summary(geom = "ribbon", fun.min = min, fun.max = max, alpha = 0.25) +
stat_summary(geom = "linerange", fun.min = min, fun.max = max, alpha = 0.3) +
stat_summary(geom = "line", fun = mean, size=1.2) +
geom_point(aes(y = Discharge)) +
annotate("rect", xmin = 60, xmax = 57, ymin = -Inf, ymax = Inf,
alpha = .08)+
annotate("rect", xmin = 52, xmax = 44, ymin = -Inf, ymax = Inf,
alpha = .08)+
scale_y_continuous(n.breaks=10)+
scale_x_reverse(n.breaks=10)+
xlab("River Mile")+
ylab("Discharge (cfs)")+
coord_cartesian(xlim=c(70,20))
#> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
#> ℹ Please use `linewidth` instead.
b<-ggplot(data, aes(x=Site, y=Gains,))+
stat_summary(geom = "bar", fun = mean)+
#stat_summary(geom = "errorbar",fun.min = min, fun.max = max, alpha = 0.3)+
annotate("rect", xmin = 60, xmax = 57, ymin = -Inf, ymax = Inf,
alpha = .08)+
annotate("rect", xmin = 52, xmax = 44, ymin = -Inf, ymax = Inf,
alpha = .08)+
scale_x_reverse(breaks=seq(20,80,5))+
scale_y_continuous(breaks=seq(-30,50,10))+
ylab("Gain and Loss (cfs)")+
xlab("River Mile") +
coord_cartesian(xlim=c(70,20))
pwrk<- b/a
pwrk + plot_layout(heights = c(1,2))
#> Warning: Removed 3 rows containing non-finite values (`stat_summary()`).
Проблема в том, что ваша переменная Gains
содержит только пропуски для Site
67, тогда как значение Discharge
равно 0 для этого сайта. Следовательно, Зона 67 берется из отброшенной гистограммы, и вы получаете немного отличающийся диапазон для шкалы x
. Чтобы исправить это, вы можете установить limits
для шкалы x на range(data$Site)
или rev(range(data$Site))
, поскольку вы используете scale_x_reverse
для обоих графиков:
library(ggplot2)
library(patchwork)
a <- ggplot(data, aes(x = Site, y = Discharge)) +
stat_summary(geom = "ribbon", fun.min = min, fun.max = max, alpha = 0.25) +
stat_summary(geom = "linerange", fun.min = min, fun.max = max, alpha = 0.3) +
stat_summary(geom = "line", fun = mean, size = 1.2) +
geom_point(aes(y = Discharge)) +
annotate("rect",
xmin = 60, xmax = 57, ymin = -Inf, ymax = Inf,
alpha = .08
) +
annotate("rect",
xmin = 52, xmax = 44, ymin = -Inf, ymax = Inf,
alpha = .08
) +
scale_y_continuous(n.breaks = 10) +
scale_x_reverse(n.breaks = 10, limits = rev(range(data$Site))) +
xlab("River Mile") +
ylab("Discharge (cfs)")
b <- ggplot(data, aes(x = Site, y = Gains)) +
stat_summary(geom = "bar", fun = mean) +
# stat_summary(geom = "errorbar",fun.min = min, fun.max = max, alpha = 0.3)+
annotate("rect",
xmin = 60, xmax = 57, ymin = -Inf, ymax = Inf,
alpha = .08
) +
annotate("rect",
xmin = 52, xmax = 44, ymin = -Inf, ymax = Inf,
alpha = .08
) +
scale_x_reverse(breaks = seq(20, 80, 5), limits = rev(range(data$Site))) +
scale_y_continuous(breaks = seq(-30, 50, 10)) +
ylab("Gain and Loss (cfs)") +
xlab("River Mile")
pwrk <- b / a
pwrk + plot_layout(heights = c(1, 2))