Home > Enterprise >  How to put two mean plots on a single plane with different scale?
How to put two mean plots on a single plane with different scale?

Time:01-10

I obtained the two separate mean plots. Is there any simple way to combine them on a single plane with different line colours? Tricky part is each has a different scale, so I want to put one (lshare) scale on left hand side of y-axis and the other (va) on right side of y-axis.

p1 <- ggplot(df, aes(x = year, y = lshare))   stat_summary(geom = "line", fun.y = mean) 

p2 <- ggplot(df, aes(x = year, y = va))   stat_summary(geom = "line", fun.y = mean)

grid.arrange(p1, p2, ncol = 2)

enter image description here

CodePudding user response:

Update2: Combining all:

library(tidyverse)
mtcars %>% 
  select(mpg, disp) %>% 
  mutate(year = 1900:1931) %>% 
  pivot_longer(
    c(mpg, disp)
  ) %>% 
  ggplot(aes(x=year, y=value, group=name, color=name)) 
  stat_summary(fun =mean, geom="line", size=1)  
  scale_y_continuous(
    name = "my first y axis",
    sec.axis = sec_axis(~./10, name="my second y axis")
  )

enter image description here

Update: How to add secodn y axis as requested: enter image description here

library(tidyverse)
mtcars %>% 
  select(mpg, disp) %>% 
  mutate(year = 1900:1931) %>% 
  ggplot(aes(x=year)) 
  geom_line(aes(y=mpg*10), size=1, color="red") 
  geom_line(aes(y=disp), size=1, color="blue")  
  scale_y_continuous(
    name = "my first y axis",
    sec.axis = sec_axis(~./10, name="my second y axis")
  )
  

First answer: Here is a reproducible example with the mtcars dataset:

library(tidyverse)
mtcars %>% 
  select(mpg, disp) %>% 
  mutate(year = 1900:1931) %>% 
  pivot_longer(
    c(mpg, disp)
  ) %>% 
  ggplot(aes(x=year, y=value, group=name, color=name)) 
  stat_summary(fun =mean, geom="line", size=1) 

enter image description here

CodePudding user response:

As @jdobres commented, you can use facet_wrap(), like in the following example. Simply introduce a grouping factor to your data.frame.

set.seed(1)

# sample data
year <- 1:20
lshare <- 0.50 - 0.02 * year   rnorm(length(year), sd = 3)
df <- data.frame(year = c(year, year), lshare = c(lshare, lshare))
df$group <- factor(gl(2, length(year)))

# plot
ggplot(df, aes(x = year, y = lshare, colour = group))  
  stat_summary(geom = "line", fun.y = mean, size = 1)  
  facet_wrap(~ group)

enter image description here

Addition

As per your edit, which I saw after I posted this answer, facet_wrap() also works when you want to have two different y-axes. You just have to play a bit with the function that is specified within sec_axis().

set.seed(1)

# sample data
year <- 1:20
lshare <- 0.50 - 0.02 * year   rnorm(length(year), sd = 3)
noise <- abs(rnorm(length(lshare), mean = 150, sd = 100))
df <- data.frame(year = c(year, year), lshare = c(lshare, lshare   noise))
df$group <- factor(gl(2, length(year)))

# set two limits
ylim_left <- with(subset(df, group == 1), c(min(lshare), max(lshare)))
ylim_right <- with(subset(df, group == 2), c(min(lshare), max(lshare)))

axis_right <- diff(ylim_left)/diff(ylim_right)
axis_left <- ylim_left[1] - axis_right * ylim_right[1]

# plot
ggplot(df, aes(x = year, y = lshare, colour = group))  
  stat_summary(geom = "line", fun = mean, size = 1)  
  facet_wrap(~ group)  
  scale_y_continuous(sec.axis = sec_axis(~ (. - axis_left)/axis_right))

enter image description here

Addition 2

If you would like to have the two lines in the same pane, you can use something along the following lines of code. Note, I use the same data as in the first addition (see above).

# set two limits
ylim_left <- with(subset(df, group == 1), c(min(lshare), max(lshare)))
ylim_right <- with(subset(df, group == 2), c(min(lshare), max(lshare)))

axis_right <- diff(ylim_left)/diff(ylim_right)
axis_left <- ylim_left[1] - axis_right * ylim_right[1]

# plot
ggplot(df, aes(colour = group))  
  stat_summary(data = subset(df, group == 1),
               mapping = aes(x = year, y = lshare),
               geom = "line", fun = mean, size = 1)  
  stat_summary(data = subset(df, group == 2),
               mapping = aes(x = year, y = lshare),
               geom = "line", fun = mean, size = 1)  
  scale_y_continuous(sec.axis = sec_axis(~ (. - axis_left)/axis_right))  
  scale_colour_manual(name = 'My_groups',
                      values = c('1' = "blue4", '2' = "darkorange"),
                      labels = c('Group 1', 'Group 2'))

enter image description here

  •  Tags:  
  • Related