Я пытаюсь организовать 2 графика, которые будут использовать общую ось X. Первый график представляет рыночный спрос на продукт, второй представляет доступные продукты и их сравнение с конкурентами. Цель состоит в том, чтобы представить два графика на одном выровненном холсте графика.
Сначала я выбрал простую гистограмму для представления рыночного спроса, таким образом:
library(tidyverse)
library(graphics)
library(ggpubr)
library(cowplot)
library(gtable)
# Some sample data (representing market potential)
set.seed(1234)
df1<-data.frame(
capacity = round(seq(from=500,to=20000,length.out=25),0),
nr = sample(seq(0,800),25)
)
# Plot representing the market potential
p1<-ggplot(df1,aes(capacity,nr))+
geom_col(colour="black", fill="blue", alpha=0.1, width = 200)+
theme_minimal()+
ggtitle("Market Assessment Project:", subtitle ="Capacity vs Market Potential")+
ylab("No. Samples")+
xlab("Capacity")
p1
Далее, я моделирую данные, которые представляют портфель продуктов, чтобы соответствовать ожиданиям рынка, таким образом:
# Step 2. Example supply side data, Product(P), sizes (030-110)
df2<-data.frame(
Name = rep(c('P030','P040','P045','P050','P060','P080','P100','P110'),4),
viscosity=c(rep('380cSt, 50Hz',8),rep('700cSt, 50Hz',8),rep('380cSt, 60Hz',8),rep('700cSt, 60Hz',8)),
minflow=c(round(seq(from=400,to=6000,length.out=8),0),
round(seq(from=300,to=4500,length.out=8),0),
round(seq(from=500,to=6600,length.out=8),0),
round(seq(from=400,to=5000,length.out=8),0)
),
maxflow=c(round(seq(from=1200,to=18000,length.out=8),0),
round(seq(from=1000,to=12000,length.out=8),0),
round(seq(from=1500,to=20000,length.out=8),0),
round(seq(from=1200,to=15000,length.out=8),0)))
# Step 3. Sample supply side data, Competitor(C), sizes
df3<-data.frame(
Name = rep(c("C010","C020","C030","C040","C050","C060","C100"),2),
viscosity=c(rep("Comp,380cSt, 50Hz",7),rep("Comp,700cSt, 50Hz",7)),
minflow=c(round(seq(from=400,to=6000,length.out=7),0),
round(seq(from=300,to=4500,length.out=7),0)),
maxflow=c(round(seq(from=1200,to=18000,length.out=7),0),
round(seq(from=1000,to=12000,length.out=7),0)))
# Join everything together to plot
df4<-data.frame(rbind(df2,df3))
# make some colour spectra
blues<-c("#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#084594") # https://colorbrewer2.org/#type=sequential&scheme=Blues&n=8
greens<-c("#edf8e9", "#c7e9c0", "#a1d99b", "#74c476", "#41ab5d", "#238b45", "#005a32") # https://colorbrewer2.org/#type=sequential&scheme=Greens&n=8
# create a plot using geom_boxplot
p2<-ggplot(df4,aes(x=viscosity,y=maxflow,ymax=minflow,ymin=minflow,lower=minflow, upper=maxflow, middle=minflow, fill=Name))+
geom_boxplot(stat="identity",position="dodge", width=0.5,colour=1, alpha=0.75)+
geom_label(aes(label=maxflow), nudge_x = -0.4, size=3, show.legend = FALSE, alpha=0.75,label.size=0.1)+
coord_flip()+
theme_minimal()+
ggtitle("Market Assessment Project:", subtitle ="Capacity vs Viscosity and Speed")+ylab("Capacity")+xlab("Application")+
scale_fill_manual(values=c(blues,greens),aesthetics = "fill")
p2
Обратите внимание, что по оси абсцисс имеются аналогичные данные, от 0 до 20k. Мои проблемы начинаются, когда я пытаюсь выровнять начало координат и ось х, я пробовал различные методы, однако все они не могут правильно выровнять два графика. Любая помощь в создании графика 3 с выровненным началом координат и осью X приветствуется.
# Mash the two plots together (badly)
aligned_plots <- align_plots(p1, p2, align="h", axis="bl")
# Not aligned !
ggdraw(aligned_plots[[3]]) + draw_plot(aligned_plots[[4]],x=0.00 ,y=0.0, scale = 1.0)
# not aligned !
ggarrange(p2,p1, ncol=1,nrow=2, heights=c(3,2))
# not aligned !
p3<-ggarrange(aligned_plots[[3]],aligned_plots[[4]], ncol=1,nrow=2, heights=c(3,2))
p3
# Aligning plot panels
# from...
# https://cran.r-project.org/web/packages/egg/vignettes/Ecosystem.html
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- rbind(g2, g1, size = "first") # at this step the dims don't match
g$widths <- unit.pmax(g1widths, g2$widths)
grid.newpage()
grid.draw(g)
# examine problem ... check the dimensions of g1, g2
dim(g1)
dim(g2)