堆叠条形图将变量转换为ggplot2 R中不相关变量的基于存在缺失的百分比
Posted
技术标签:
【中文标题】堆叠条形图将变量转换为ggplot2 R中不相关变量的基于存在缺失的百分比【英文标题】:stacked barplot converting a variable into a presence absence based percentage for unrelated variables in ggplot2 R 【发布时间】:2017-03-26 07:51:36 【问题描述】:以下是示例数据框
df <- data.frame(SampleID = c(1, 2, 3, 4, 5, 6, 7, 8),
Var1 = c(0.1 , 0.5, 0.7, 0, 0, 0, 0.5, 0.2),
Var1PA = c("Present", "Present", "Present", "Absent", "Absent", "Absent", "Present", "Present"),
Var2 = c(0, 0, 0, 0, 0.1, 0.5, 0.7, 0.2),
Var2PA = c("Absent", "Absent", "Absent", "Absent", "Present", "Present", "Present", "Present"))
我的问题一开始看起来很简单,但我找不到合适的方法来编辑数据框以绘制条形图。
对于 Var1,我想绘制 var1 在样本中出现(即 var1 值 > 0)或不存在(var2 等类似)的次数百分比的堆积条形图。
我可以通过以下方式确定这个百分比:
(1 - sum(df$Var1 == 0) / length(df$Var1)) * 100
但是如何在绘图时将其转换为百分比? 我查看了许多融化选项,但对于这些变量没有统一的标准来形成一个共同的 X 轴
最后,如果我想从包含 1000 个此类列变量的数据框中绘制 5 个变量,该如何回答上述问题?
编辑:感谢到目前为止的答案!我对这个问题稍作修改 我刚刚在我的数据框中又添加了一个变量
df <- data.frame(SampleID = c(1, 2, 3, 4, 5, 6, 7, 8),
Var1 = c(0.1 , 0.5, 0.7, 0, 0, 0, 0.5, 0.2),
Var1PA = c("Present", "Present", "Present", "Absent", "Absent", "Absent", "Present", "Present"),
Var2 = c(0, 0, 0, 0, 0.1, 0.5, 0.7, 0.2),
Var2PA = c("Absent", "Absent", "Absent", "Absent", "Present", "Present", "Present", "Present"),
Disease = c("Case", "Control", "Case", "Control", "Case", "Control", "Case", "Control"))
我正在尝试弄清楚如何为 Var1PA、Var2PA 等堆叠在其中的情况和控件绘制条形图。如果我有正确的数据框输入,ggplot2 代码将是: vars geom_bar(aes(fill = Var1), position = "stack", stat="identity") + facet_grid(~vars)
如何获取每个变量的案例(存在和不存在)和控制(存在和不存在)的百分比?谢谢!
【问题讨论】:
应该堆叠什么 存在/缺席的百分比,谢谢! 抱歉无法测试vars <- c('Var1PA', 'Var2PA', 'Var2PA'); tt <- data.frame(prop.table(as.table(sapply(df[, vars], table)), 2) * 100); ggplot(tt, aes(Var2, Freq, fill = Var1)) + geom_bar(stat = 'identity')
一种有点老套的方式:library(tidyverse) ; df %>% gather(var, pa, ends_with('PA')) %>% group_by(var) %>% do(pa = names(table(.$pa)), pct = prop.table(table(.$pa)) * 100) %>% unnest() %>% ggplot(aes(var, pct, fill = pa)) + geom_bar(stat = 'identity')
@rawr 抱歉回复晚了谢谢你的回答,这对我帮助很大!如果我在我的 df 中添加另一个变量疾病,使用 prop.table 是否可以轻松地分别获取每个 var 中的案例(存在和不存在)和控制(存在和不存在)的百分比?
【参考方案1】:
这应该很好地概括。当然,您可以对您选择的变量更有选择性。
library(dplyr)
library(tidyr)
mdf = df %>% select(SampleID, ends_with("PA")) %>%
gather(key = Var, value = PA, -SampleID) %>%
mutate(PA = factor(PA, levels = c("Present", "Absent")))
ggplot(mdf, aes(x = Var, fill = PA)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent)
您可以将百分比列添加到长数据框中:
mdf %>% group_by(Var) %>%
mutate(p_present = mean(PA == "Present"),
p_absent = mean(PA == "Absent"))
# Source: local data frame [16 x 5]
# Groups: Var [2]
#
# SampleID Var PA p_present p_absent
# <dbl> <chr> <fctr> <dbl> <dbl>
# 1 1 Var1PA Present 0.625 0.375
# 2 2 Var1PA Present 0.625 0.375
# 3 3 Var1PA Present 0.625 0.375
# 4 4 Var1PA Absent 0.625 0.375
# 5 5 Var1PA Absent 0.625 0.375
# 6 6 Var1PA Absent 0.625 0.375
# 7 7 Var1PA Present 0.625 0.375
# 8 8 Var1PA Present 0.625 0.375
# 9 1 Var2PA Absent 0.500 0.500
# 10 2 Var2PA Absent 0.500 0.500
或者,如果您希望看到每组 1 行的摘要,请将 mutate
替换为 summarize
:
mdf %>% group_by(Var) %>%
summarize(p_present = mean(PA == "Present"),
p_absent = mean(PA == "Absent"))
# # A tibble: 2 × 3
# Var p_present p_absent
# <chr> <dbl> <dbl>
# 1 Var1PA 0.625 0.375
# 2 Var2PA 0.500 0.500
【讨论】:
您好,非常感谢您的回答,非常抱歉回复晚了。生活接管了..我尝试了您的解决方案,但是对我来说有点难以理解,因为收集和变异都是我以前没有使用过的新功能。此外,在您的回答中,我还想实际查看我正在绘制的最终表格(mdf)中的频率计数。我对问题进行了一些编辑,如果您对此有任何建议,请告诉我。我赞成你的回答..谢谢!mutate
所做的只是创建新列,gather
或多或少等同于 melt
。 (gather
的功能略少,但语法更简单。)我将添加几行将百分比放入数据中。
我在这里发布了一个新问题:***.com/questions/40859308/…。感谢您的宝贵时间!以上是关于堆叠条形图将变量转换为ggplot2 R中不相关变量的基于存在缺失的百分比的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:可视化连续(数值)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩自定义直方图bin的个数(Histogram for Continuous Variable)
R语言ggplot2可视化:可视化离散(分类)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩(Histogram for Categorical Variable)自定义轴标签旋转的角度
R可视化ggplot2绘制堆叠的条形图(Stacked Barplot)
R语言ggplot2可视化:ggplot2可视化水平堆叠条形图并且在每个堆叠条形图的内部居中添加百分比文本标签信息
R语言使用ggplot2可视化堆叠条形图,并在堆叠条形图上显示数据值实战
R语言ggplot2可视化:可视化连续(数值)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩自定义直方图bin的宽度基于宽度自动选择bin的个数(Histogram for Contin