Выравнивание начала координат и оси X с помощью Cowplot или ggpubs в R - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь организовать 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

Plot 1

Далее, я моделирую данные, которые представляют портфель продуктов, чтобы соответствовать ожиданиям рынка, таким образом:

# 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

Plot 2

Обратите внимание, что по оси абсцисс имеются аналогичные данные, от 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

Plot 3

# 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)
...