Trying to plot multiple plots with two factors

时间:2018-02-01 18:03:29

标签: r plot ggplot2

EDIT: SOLVED Used this code:

gg5 <- ggplot(df_tidy, aes(x=Year, y=Landing))+
  geom_line()
gg5 + facet_wrap(~df_tidy$country)

I'm sorry, this is slightly a duplicate question. But I'm asking it because I've tried the different answers and nothing seems to work.

I want to create some plots. I want to have separate plots per country. And I want to have different lines on each plot for region. I've got ggplot2 and I've got ggplus. In total, I'm going to have approximately 150 plots, so facet_multiple seems to be the answer so I can spread it over a number of pages. But what I am getting in practice is not what I anticipate in theory.

Here's some dummy data:

library(tidyverse)
country = c("USA", "Canada", "UK", "France", "Mexico")
region = c("North America", "North America", "Europe", "Europe", "North America")  
2000 = c(50, 100, 75, 60, 25) 
2001 = c(200, 50, 150, 125, 60)
2002 = c(125,75,60, 75, 25)
df = data.frame(country, region, 2000, 2001, 2002) 
df_tidy <- df %>% gather(Year, Landing, c(3:5))

     country     region      Year   Value
 1      USA   North America  2000    50
 2   Canada   North America  2000   100
 3       UK       Europe     2000    75
 4   France       Europe     2000    60
 5   Mexico   North America  2000    25
 6      USA   North America  2001   200
 7   Canada   North America  2001    50
 8       UK       Europe     2001   150
 9   France       Europe     2001   125
10   Mexico   North America  2001    60
11      USA   North America  2002   125
12   Canada   North America  2002    75
13       UK      Europe      2002    60
14   France      Europe      2002    75
15   Mexico   North America  2002    25

Please just imagine there might be 2 (or 3 or 4..) different regions per country.

Now, if I break individual countries out into their own data.frame, I get the exact plot I want: Correct plot!

#This works
USA <- df_tidy %>%
filter(Country %in% c("USA") & between(Year,2000,2002)) %>%
select(Country, Year, Landing)

ggplot(USA, aes(x=Year, y=Landing)) +
geom_line(data = USA)
#End of USA plot

But when I try to ggplot the entire data frame using facets, I get something like this: Really weird plot

I've tried multiple different ways to do it, and if I don't get an error message, I get the really weird plot.

Some code I've tried:

#Attempt 1:
gg1 <- ggplot(df_tidy, aes(x=df_tidy$Year, y=df_tidy$Landing, color = df_tidy$region))+
geom_line()

#doesnt work
gg1+facet_wrap(~df_tidy$country, ncol = 4, nrow = 4)

#doesnt work
gg1 + facet_grid(df_tidy$country) + facet_grid(df_tidy$region) 

#doesnt work   
facet_grid(gg1, facets = "country") 

#Attempt 2
 plist = lapply(split(df_tidy, df_tidy$country), function(d) {
 ggplot(d, aes(x=Year, y=Landing))+
 geom_line()+
 facet_wrap(~ df_tidy$country)+
 scale_y_continuous()})

library(gridExtra)
for(i in seq(1, length(plist), 6)) {
pdf(paste0("country_", i, ".pdf"), 7, 5)
grid.arrange(grobs=plist[i:(i+5)],
            ncol(3, left="Landing", bottom="Year"))}

Anyways, I can put up every attempt, but I've deleted and changed code so much I don't even remember where I started. Any advice would be appreciated because I really dont want to have to each country by seperate data frame. Thanks!

Update - after trying the solution, here's what I'm still getting:

myPlots <- list()
 for(i in unique(df_tidy$region)) {
   myPlots[[i]] <- ggplot(subset(df_tidy, df_tidy$country == i),
                      aes(Year, Landing, color = region)) +
 geom_line(size=2)+
 labs(title = paste("Landings in", i),
      subtitle = "From 2000-2002",
      x = "Year",
      y = "Landing",
      color = NULL) +
 scale_color_brewer(palette = "Set2") + 
 theme_minimal()+
 theme(legend.position = "bottom")
 }

library(ggpubr) ggarrange(plotlist = myPlots)

loop plot

ggplot(df_tidy, aes(Year, Landing))+
  geom_line()+
  facet_wrap(~ df_tidy$region + df_tidy$country)

facet_wrap

1 个答案:

答案 0 :(得分:0)

正如您所提到的,这个问题可能是重复的,因为存在许多类似的问题,但有时它们非常具体。

首先,我们可以使用简单的facet_wrap

ggplot(df_tidy, aes(Year, Landing)) +
    geom_line() +
    facet_wrap(~ region + country)

我在这里创建的结构是regioncountry~ region + country)的组合

enter image description here

另一种解决方案是

  1. 遍历区域并创建单独的图
  2. 将图表与某些功能相结合
  3. 这里我将使用每个区域相同的托盘(也添加了最小的视觉调整)。

    # Loop over regions and create separate plots
    myPlots <- list()
    for(i in unique(df_tidy$region)) {
        myPlots[[i]] <- ggplot(subset(df_tidy, region == i), 
            aes(Year, Landing, color = country)) +
        geom_line(size = 2) +
        labs(title = paste("Landing change in", i),
             subtitle = "From xxxx to yyyy",
             x = "Year",
             y = "Landing",
             color = NULL) +
        scale_color_brewer(palette = "Set2") +
        theme_minimal() +
        theme(legend.position = "bottom")
    }
    
    # Combine plots with some function
    library(ggpubr)
    ggarrange(plotlist = myPlots)
    

    enter image description here

    数据&amp;包:

    library(tidyverse)
    df_tidy <- structure(list(country = structure(c(5L, 1L, 4L, 2L, 3L, 5L, 
    1L, 4L, 2L, 3L, 5L, 1L, 4L, 2L, 3L), .Label = c("Canada", "France", 
    "Mexico", "UK", "USA"), class = "factor"), region = structure(c(2L, 
    2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L), .Label = c("Europe", 
    "North America"), class = "factor"), Year = c(2000, 2000, 2000, 
    2000, 2000, 2001, 2001, 2001, 2001, 2001, 2002, 2002, 2002, 2002, 
    2002), Landing = c(50, 100, 75, 60, 25, 200, 50, 150, 125, 60, 
    125, 75, 60, 75, 25)), row.names = c(NA, -15L), .Names = c("country", 
    "region", "Year", "Landing"), class = "data.frame")