从一个数据框中制作多个单独的堆叠条形图

make multiple separate stacked barplots from one data frame

我想用多个数据框创建多个分组和跟踪的条形图,并能够将这些图导出到一个 pdf 文件中。

我有几个格式相同但值不同的数据框。对于每个数据框,我想创建多个跟踪和分组的条形图。理想情况下,数据框中同一组的条形图应彼此相邻放置,并共享相同的 Y 轴长度(以便轻松直观地比较数据框)。

她是 ma 数据的示例:

data1 <- data.frame(group=c('A','A','A','A','B','B','B','B','C','C','C','C'),
          Year=c('2012','2013','214','2015','2012','2013','214','2015','2012','2013','214','2015'),
          Fruit=c(5,3,6,3,5,4,2,2,3,4,6,2),
          Vegetables=c(3,6,1,4,8,9,43,2,1,5,0,1),
          Rice=c(20,23,53,12,45,5,23,12,32,41,54,32))

data2 <- data.frame(group=c('A','A','A','A','B','B','B','B','C','C','C','C'),
                   Year=c('2012','2013','214','2015','2012','2013','214','2015','2012','2013','214','2015'),
                   Fruit=c(2,4,5,2,3,9,4,7,5,7,4,7),
                   Vegetables=c(9,7,8,7,4,3,0,0,2,3,5,6),
                   Rice=c(23,12,32,41,54,32,20,23,53,12,45,5))

data1 <- pivot_longer(data1, cols = 3:5, names_to = 'Type', values_to = 'value')
data2 <- pivot_longer(data1, cols = 3:5, names_to = 'Type', values_to = 'value') 

我开始像这样格式化表格:

data1 <- pivot_longer(data1, cols = 3:5, names_to = 'Type', values_to = 'value')
data2 <- pivot_longer(data1, cols = 3:5, names_to = 'Type', values_to = 'value')

我尝试使用 ggplot 创建所需的 PDF 到目前为止都失败了。我进行了几次不同的尝试,但无法接近所需的 PDF。我找到了有关如何为一个数据框、分组图或跟踪图创建多个图的说明,但从未找到这三者的组合。

如果可能的话,我想为这个例子获取的 PDF 应该是这样的:

Q1。这样的事情是可能的还是必须创建两个 PDF(对于每个 data.table,此处:data1 和 data2)。 Q2。是否可以根据数据框自动调整所需绘图数量并自动调整 PDF 文件大小并在必要时创建新页面的方式格式化代码? (实际上我有 5 个数据框和 13 个组,但是这可能会随着时间而改变)

我知道这是一个很难写的代码。不过,我已经在这上面花了两个工作日,这就是为什么我现在在这里寻求帮助。明天我会再试一次 post 任何可能的进展。

非常感谢您的任何建议

此代码应生成所需的图(或至少是非常接近的图)。两个关键步骤包括:1) 使用 bind_rows 将所有数据帧合并为一个数据帧,2) 使用 facet_grid 设置根据两个变量(group 和 id)定义布局面板。

library(tidyverse)

# Combine the data
# id column contains the number of the dataframe from which the data comes from 
df <- bind_rows(data1, data2, .id = "id")

df %>%
  # Change to long format, add 1 to the columns number, as we now added id column
  pivot_longer(cols = 4:6, 
               names_to = 'Type', 
               values_to = 'value') %>%
  # Transform value to x / 1
  mutate_at(vars(value), function(x) x / 1) %>%
  # Do plot 
  ggplot(aes(x = Year, 
             y = value,
             fill = Type)) +
  # columns
  geom_col()+
  # Facets by two factors, groups and data source (id)
  facet_grid(group ~ id) 

# Save plot to pdf
ggsave("my_plot.pdf",
       device = "pdf",
       height = 15,
       width = 20,
       units = "cm",
       dpi = 300)