从一个数据框中制作多个单独的堆叠条形图
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 应该是这样的:
- 共6个地块:左3个地块data1,右3个地块data2; A 组 row1,B 组 row2,C 组 row3(如果可能的话,y 轴长度相同 row/Group)
- 所有条形图:x 轴 = 年,y 轴 = 值/每年 1 个有柄条,颜色匹配类型(水果、蔬菜、大米)
- 每行组名
- 每列数据源(data1, data2)
- 带类型的图例(水果、蔬菜、大米)
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)
我想用多个数据框创建多个分组和跟踪的条形图,并能够将这些图导出到一个 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 应该是这样的:
- 共6个地块:左3个地块data1,右3个地块data2; A 组 row1,B 组 row2,C 组 row3(如果可能的话,y 轴长度相同 row/Group)
- 所有条形图:x 轴 = 年,y 轴 = 值/每年 1 个有柄条,颜色匹配类型(水果、蔬菜、大米)
- 每行组名
- 每列数据源(data1, data2)
- 带类型的图例(水果、蔬菜、大米)
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)