在 R 中绘制百分比堆积条形图
plotting a percentage stacked bar chart in R
所以我有一个简化形式的数据框,如下所示。
|期间|AA|
|第一天 | 1 |
|第一天 | 0 |
|第一天 | 2 |
|第一天 | 2 |
|第二天 | 0 |
|第二天 | 1 |
|第三天 | 1 |
|第三天 | 2 |
|第三天 | 0 |
.
.
.
.
|第 99 天 | 0 |
现在我想为“AA”绘制一个图表,其中“Period”是 x 轴,“0-100”是 y 轴绘制每个“0”、“1”的总频率, 百分比为“2”,如百分比堆积条形图。
我为单列 AA 尝试过类似的方法,但它对我想要的没有帮助。
library("ggplot2")
library("dplyr")
Count=1
data <- aggregate(Count ~ ., data, sum)
data <- group_by(data, Period) %>%
mutate(percent = Count / sum(Count)) %>%
as.data.frame()
ggplot(data,
aes(x = Period,
y = percent,
fill = AA)) +
geom_bar(position = "fill", stat = "identity")
假设您的数据集是这样的:
data <- data.frame(period = rep(paste(rep("Day",5) , 1:5 , sep="") , each=3) ,
AA = sample(0:2 , 15 , replace=T),
BB = sample(0:2 , 15 , replace=T),
CC = sample(0:2 , 15 , replace=T))
然后你就可以像这样把它弄成你需要的形状了。在这里,我从句点中提取数字,以便稍后制作一个漂亮的数字轴。
data <- data %>% group_by(period) %>%
summarise(across(1:3 , sum)) %>%
gather(class, value , 2:4) %>%
mutate(period = str_extract(period , "\d+"))
然后你就可以像这样得到你的图表了。添加 + coord_flip()
如果您希望它作为条形图而不是柱状图。
ggplot(data , aes(period , value , fill=class))+geom_col(position = "fill")
如果您需要在绘图前计算百分比,那么...
data <- data %>% group_by(period) %>%
summarise(across(1:3 , sum)) %>%
gather(class, value , 2:4) %>%
group_by(period) %>%
mutate(value = value/sum(value)) %>%
mutate(period = str_extract(period , "\d+"))
我想这会解决你的问题
df <- data.frame(
stringsAsFactors = FALSE,
Period = c("Day1","Day1","Day1","Day1",
"Day2","Day2","Day3","Day3","Day3","Day3","Day4",
"Day4","Day4","Day4"),
AA = c(1L, 0L, 2L, 2L, 0L, 1L, 1L, 2L, 0L, 0L, 1L, 2L, 2L, 2L)
)
suppressMessages(library(tidyverse))
df %>% count(Period, AA) %>%
ggplot() +
geom_col(aes(x= Period, y = n, fill= as.character(AA)), position = 'fill')
由 reprex package (v2.0.0)
于 2021-05-01 创建
所以我有一个简化形式的数据框,如下所示。
|期间|AA|
|第一天 | 1 |
|第一天 | 0 |
|第一天 | 2 |
|第一天 | 2 |
|第二天 | 0 |
|第二天 | 1 |
|第三天 | 1 |
|第三天 | 2 |
|第三天 | 0 | .
.
.
.
|第 99 天 | 0 |
现在我想为“AA”绘制一个图表,其中“Period”是 x 轴,“0-100”是 y 轴绘制每个“0”、“1”的总频率, 百分比为“2”,如百分比堆积条形图。
我为单列 AA 尝试过类似的方法,但它对我想要的没有帮助。
library("ggplot2")
library("dplyr")
Count=1
data <- aggregate(Count ~ ., data, sum)
data <- group_by(data, Period) %>%
mutate(percent = Count / sum(Count)) %>%
as.data.frame()
ggplot(data,
aes(x = Period,
y = percent,
fill = AA)) +
geom_bar(position = "fill", stat = "identity")
假设您的数据集是这样的:
data <- data.frame(period = rep(paste(rep("Day",5) , 1:5 , sep="") , each=3) ,
AA = sample(0:2 , 15 , replace=T),
BB = sample(0:2 , 15 , replace=T),
CC = sample(0:2 , 15 , replace=T))
然后你就可以像这样把它弄成你需要的形状了。在这里,我从句点中提取数字,以便稍后制作一个漂亮的数字轴。
data <- data %>% group_by(period) %>%
summarise(across(1:3 , sum)) %>%
gather(class, value , 2:4) %>%
mutate(period = str_extract(period , "\d+"))
然后你就可以像这样得到你的图表了。添加 + coord_flip()
如果您希望它作为条形图而不是柱状图。
ggplot(data , aes(period , value , fill=class))+geom_col(position = "fill")
如果您需要在绘图前计算百分比,那么...
data <- data %>% group_by(period) %>%
summarise(across(1:3 , sum)) %>%
gather(class, value , 2:4) %>%
group_by(period) %>%
mutate(value = value/sum(value)) %>%
mutate(period = str_extract(period , "\d+"))
我想这会解决你的问题
df <- data.frame(
stringsAsFactors = FALSE,
Period = c("Day1","Day1","Day1","Day1",
"Day2","Day2","Day3","Day3","Day3","Day3","Day4",
"Day4","Day4","Day4"),
AA = c(1L, 0L, 2L, 2L, 0L, 1L, 1L, 2L, 0L, 0L, 1L, 2L, 2L, 2L)
)
suppressMessages(library(tidyverse))
df %>% count(Period, AA) %>%
ggplot() +
geom_col(aes(x= Period, y = n, fill= as.character(AA)), position = 'fill')
由 reprex package (v2.0.0)
于 2021-05-01 创建