ppi0trek
ppi0trek

Reputation: 117

Same width of few ggplots combined with grid.arrange function

Is there a way to set a width for a ggplot?

I am trying to combine three timeplots in one column. Because of y-axis values, plots have different width (two plots have axis values within range (-20 , 50), one (18 000, 25 000) - which makes plot thiner). I want to make all plots exactly the same width.

plot1<-ggplot(DATA1, aes(x=Date,y=Load))+
  geom_line()+
  ylab("Load [MWh]") +
  scale_x_date(labels = date_format("%m/%y"),breaks = date_breaks("months"))+
  theme_minimal()+
  theme(panel.background=element_rect(fill = "white") )
plot2<-ggplot(DATA1, aes(x=Date,y=Temperature))+
  geom_line()+
  ylab("Temperature [C]") +
  scale_x_date(labels = date_format("%m/%y"),breaks = date_breaks("months"))+
  theme_minimal()+
  theme(panel.background=element_rect(fill = "white") )
plot3<-ggplot(DATA1, aes(x=Date,y=WindSpeed))+
  geom_line()+
  ylab("Wind Speed [km/h]") +
  scale_x_date(labels = date_format("%m/%y"),breaks = date_breaks("months"))+
  theme_minimal()+
  theme(panel.background=element_rect(fill = "white") )
grid.arrange(plot1, plot2, plot3, nrow=3)

Combined plot looks like this: enter image description here

Upvotes: 0

Views: 340

Answers (1)

Paul Hiemstra
Paul Hiemstra

Reputation: 60924

You can simply use facetting for this. First you have to do some data munging:

library(tidyr)

new_data = gather(DATA1, variable, value, Load, Temperature, WindSpeed) 

this gathers all the data in Load, Temperature and Windspeed into one big column (value). In addition, an extra column is created (variable) which specifies which value in the vector belongs to which variable.

After that you can plot the data:

ggplot(new_data) + geom_line(aes(x = Date, y = value)) + 
   facet_wrap(~ variable, scales = 'free_y', ncol = 1)

Now ggplot2 will take care of all the heavy lifting.

ps If you make you question reproducible, I can make my answer reproducible.

Upvotes: 1

Related Questions