R ggplot2 问题与堆叠 barplot 与 3 个变量混合镜像密度图
R ggplot2 problems with stacked barplot with 3 variables mixed with mirror density chart
亲爱的 Whosebug 社区,
再一次,我有一个关于 R 的 ggplot2 可能性的问题。
在我开始解释我的问题之前,下面提供了一个数据框示例:
age <- c(12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15)
anticoagulation <- c(0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1)
atc <- c(1, 0, 2, 0, 1, 2, 1, 0, 2, 0, 1, 2, 1, 0, 2, 0, 1, 2, 0, 0)
df <- data.frame(age, anticoagulation, atc)
- 抗凝编码:0 = 无抗凝,1 = 接受抗凝
- atc 编码:0 = 呋喃妥因,1 = 磷霉素,2 = 甲氧苄氨嘧啶
我想可视化每个年龄组和每个 atc 组的抗凝处方差异。到目前为止我做了什么:
frame <- aggregate(df$anticoagulation, by=list(df$age), FUN=length)
frame$age <- frame$Group.1
frame$n <- frame$x
frame <- frame [,3:4]
my_table<- table(df$age, df$anticoagulation)
table <- as.data.frame.matrix(my_table)
frame$n_noanti <- table$"0"
frame$n_yesanti <- table$"1"
frame$per_yesanti <- (frame$n_yesanti/frame$n)*100 # percentage
frame$per_noanti <- (frame$n_noanti/frame$n)*100 # percentage
ggplot(frame, aes(x=x) ) +
geom_bar( aes(x = reorder (age, -per_yesanti), y =per_yesanti), stat="identity", fill="#69b3a2" ) +
geom_label(aes(x=15, y=100, label="Used anticoagulants"), color="#69b3a2")+
geom_bar( aes( x =reorder (age, -per_noanti), y=-per_noanti), stat="identity", fill="#404080" ) +
geom_label( aes(x=15, y=-100, label="No anticoagulants"), color="#404080") +
theme(axis.text.x=element_blank()) +
xlab ("Age") +
ylab ("Percentages of how many women used anticoagulants")+
ggtitle("Distribution of anticoagulants per age")+
theme(plot.title = element_text(hjust = 0.5), text = element_text(size=15))
输出
Output of ggplot mirror density here above
但是,我想要这样的图表,但是有这样的堆积条:
Example of stacked bars
堆叠部分基于atc编码。我试过只做一个堆叠图,但失败得很惨。
我已经尝试使用代码 'aggregate',但我对使用什么以及将什么合并在一起感到困惑。
frame2 <- aggregate(frame$anticoagulation, by=list(frame$age, frame$atc), FUN=length)
但是,此聚合代码使其使用时间过长。
我也尝试过,对 atc 与年龄使用单独的聚合代码并将其添加到 'frame'。
atc2<- table(df$age, df$atc)
t_atc2 <- as.data.frame.matrix(atc2)
frame$n_nitro <- t_atc2$"0"
frame$n_fosfo <- t_atc2$"1"
frame$n_trim <- t_atc2$"2"
但是,我仍然无法使用堆叠功能。我尝试做一个只有抗凝百分比的堆积条=是(编码=1)=
ggplot(frame, aes(fill = n_nitro+n_fosfo+n_trim, y=per_yesanti, x=age)) +
geom_bar(position="stack", stat="identity") +
ggtitle("Anticoagulation per age")
graph: No distinction between the 2 atc groups
我希望有人能把这两个图混在一起。如果这是不可能的,那么只有抗凝百分比 = 1 (per_yesanti) 的堆叠图也很好。
所以,总之,如果混合图是很难的。如何制作下图(所以只有一张图):
- 仅含抗凝剂的详细信息 = 1/ 是
- 抗凝剂的详细信息必须以百分比表示(按总抗凝剂计算yes/no)
- x 轴是每个年龄
- de bar必须由atc填写
像这样:
enter image description here
提前致谢!
我仍然不确定如何处理您的数据,但我尝试给出一个答案。 ggplot2
中直接根据另一个变量分组的百分比获得条形图有点困难。因此,最简单的解决方案是预先计算百分比,然后使用 geom_col
绘制这些。
使用 dplyr
,您可以 group_by
同时 age
和您想要堆叠分离的其他变量:
age <- c(12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15)
anticoagulation <- c(0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1)
atc <- c(1, 0, 2, 0, 1, 2, 1, 0, 2, 0, 1, 2, 1, 0, 2, 0, 1, 2, 0, 0)
df <- data.frame(age, anticoagulation, atc)
library(dplyr)
library(ggplot2)
df_summary <- df %>%
group_by(age, anticoagulation) %>%
summarise(count = n()) %>%
mutate(percentage = count / sum(count) * 100)
ggplot(df_summary, aes(x = factor(age), y = percentage, fill = factor(anticoagulation))) +
geom_col()
df_summary_2 <- df %>%
group_by(age, atc) %>%
summarise(count = n()) %>%
mutate(percentage = count / sum(count) * 100)
ggplot(df_summary_2, aes(x = factor(age), y = percentage, fill = factor(atc))) +
geom_col()
编辑
我调整了图表。我无法想出一个解决方案来一次计算所有内容。因此,我首先计算 total_count_info
中每个年龄组的计数。这使我可以稍后计算每个年龄组的百分比。然后我计算 atc
每个 age
和 anticoagulation
:
的出现次数
total_count_info <- df %>%
group_by(age) %>%
summarise(count_age = n())
df_summary_3 <- df %>%
group_by(age, anticoagulation, atc) %>%
summarise(count = n()) %>%
left_join(total_count_info) %>%
mutate(percentage = count / count_age * 100)
ggplot(df_summary_3 %>% filter(anticoagulation == 1),
aes(x = factor(age), y = percentage, fill = factor(atc))) +
geom_col() +
ylab("percentage of anticoagulation == 1")
亲爱的 Whosebug 社区,
再一次,我有一个关于 R 的 ggplot2 可能性的问题。 在我开始解释我的问题之前,下面提供了一个数据框示例:
age <- c(12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15)
anticoagulation <- c(0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1)
atc <- c(1, 0, 2, 0, 1, 2, 1, 0, 2, 0, 1, 2, 1, 0, 2, 0, 1, 2, 0, 0)
df <- data.frame(age, anticoagulation, atc)
- 抗凝编码:0 = 无抗凝,1 = 接受抗凝
- atc 编码:0 = 呋喃妥因,1 = 磷霉素,2 = 甲氧苄氨嘧啶
我想可视化每个年龄组和每个 atc 组的抗凝处方差异。到目前为止我做了什么:
frame <- aggregate(df$anticoagulation, by=list(df$age), FUN=length)
frame$age <- frame$Group.1
frame$n <- frame$x
frame <- frame [,3:4]
my_table<- table(df$age, df$anticoagulation)
table <- as.data.frame.matrix(my_table)
frame$n_noanti <- table$"0"
frame$n_yesanti <- table$"1"
frame$per_yesanti <- (frame$n_yesanti/frame$n)*100 # percentage
frame$per_noanti <- (frame$n_noanti/frame$n)*100 # percentage
ggplot(frame, aes(x=x) ) +
geom_bar( aes(x = reorder (age, -per_yesanti), y =per_yesanti), stat="identity", fill="#69b3a2" ) +
geom_label(aes(x=15, y=100, label="Used anticoagulants"), color="#69b3a2")+
geom_bar( aes( x =reorder (age, -per_noanti), y=-per_noanti), stat="identity", fill="#404080" ) +
geom_label( aes(x=15, y=-100, label="No anticoagulants"), color="#404080") +
theme(axis.text.x=element_blank()) +
xlab ("Age") +
ylab ("Percentages of how many women used anticoagulants")+
ggtitle("Distribution of anticoagulants per age")+
theme(plot.title = element_text(hjust = 0.5), text = element_text(size=15))
输出 Output of ggplot mirror density here above
但是,我想要这样的图表,但是有这样的堆积条: Example of stacked bars
堆叠部分基于atc编码。我试过只做一个堆叠图,但失败得很惨。
我已经尝试使用代码 'aggregate',但我对使用什么以及将什么合并在一起感到困惑。
frame2 <- aggregate(frame$anticoagulation, by=list(frame$age, frame$atc), FUN=length)
但是,此聚合代码使其使用时间过长。
我也尝试过,对 atc 与年龄使用单独的聚合代码并将其添加到 'frame'。
atc2<- table(df$age, df$atc)
t_atc2 <- as.data.frame.matrix(atc2)
frame$n_nitro <- t_atc2$"0"
frame$n_fosfo <- t_atc2$"1"
frame$n_trim <- t_atc2$"2"
但是,我仍然无法使用堆叠功能。我尝试做一个只有抗凝百分比的堆积条=是(编码=1)=
ggplot(frame, aes(fill = n_nitro+n_fosfo+n_trim, y=per_yesanti, x=age)) +
geom_bar(position="stack", stat="identity") +
ggtitle("Anticoagulation per age")
graph: No distinction between the 2 atc groups
我希望有人能把这两个图混在一起。如果这是不可能的,那么只有抗凝百分比 = 1 (per_yesanti) 的堆叠图也很好。
所以,总之,如果混合图是很难的。如何制作下图(所以只有一张图):
- 仅含抗凝剂的详细信息 = 1/ 是
- 抗凝剂的详细信息必须以百分比表示(按总抗凝剂计算yes/no)
- x 轴是每个年龄
- de bar必须由atc填写
像这样: enter image description here
提前致谢!
我仍然不确定如何处理您的数据,但我尝试给出一个答案。 ggplot2
中直接根据另一个变量分组的百分比获得条形图有点困难。因此,最简单的解决方案是预先计算百分比,然后使用 geom_col
绘制这些。
使用 dplyr
,您可以 group_by
同时 age
和您想要堆叠分离的其他变量:
age <- c(12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15)
anticoagulation <- c(0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1)
atc <- c(1, 0, 2, 0, 1, 2, 1, 0, 2, 0, 1, 2, 1, 0, 2, 0, 1, 2, 0, 0)
df <- data.frame(age, anticoagulation, atc)
library(dplyr)
library(ggplot2)
df_summary <- df %>%
group_by(age, anticoagulation) %>%
summarise(count = n()) %>%
mutate(percentage = count / sum(count) * 100)
ggplot(df_summary, aes(x = factor(age), y = percentage, fill = factor(anticoagulation))) +
geom_col()
df_summary_2 <- df %>%
group_by(age, atc) %>%
summarise(count = n()) %>%
mutate(percentage = count / sum(count) * 100)
ggplot(df_summary_2, aes(x = factor(age), y = percentage, fill = factor(atc))) +
geom_col()
编辑
我调整了图表。我无法想出一个解决方案来一次计算所有内容。因此,我首先计算 total_count_info
中每个年龄组的计数。这使我可以稍后计算每个年龄组的百分比。然后我计算 atc
每个 age
和 anticoagulation
:
total_count_info <- df %>%
group_by(age) %>%
summarise(count_age = n())
df_summary_3 <- df %>%
group_by(age, anticoagulation, atc) %>%
summarise(count = n()) %>%
left_join(total_count_info) %>%
mutate(percentage = count / count_age * 100)
ggplot(df_summary_3 %>% filter(anticoagulation == 1),
aes(x = factor(age), y = percentage, fill = factor(atc))) +
geom_col() +
ylab("percentage of anticoagulation == 1")