使用两个预测变量绘制分类数据图

时间:2018-09-22 12:17:07

标签: r ggplot2 categorical-data

这个问题是我问过的previous one的扩展,其中的数据稍微复杂一些。这似乎很基本,但是我为此已经将头撞墙了。

我需要通过自变量choice(x轴)和ses(可能是堆积的barplot分组)来创建因变量(agegroup)的患病率百分比图)。理想情况下,我希望该图为并排的两面图,每性别各有一个面。

我数据的相关部分是这种形式:

subject   choice       agegroup    sex       ses

John      square       2           Female    A
John      triangle     2           Female    A
John      triangle     2           Female    A
Mary      circle       2           Female    C
Mary      square       2           Female    C
Mary      rectangle    2           Female    C
Mary      square       2           Female    C
Hodor     hodor        5           Male      D
Hodor     hodor        5           Male      D
Hodor     hodor        5           Male      D
Hodor     hodor        5           Male      D
Jill      square       3           Female    B
Jill      circle       3           Female    B
Jill      square       3           Female    B
Jill      hodor        3           Female    B
Jill      triangle     3           Female    B
Jill      rectangle    3           Female    B
... [about 12,000 more observations follow]

我想使用ggplot2来获得强大的功能和灵活性以及明显的易用性。但是,我发现的每个教程或操作方法都已经完成了90%的工作,这是因为它们只是加载了R或其包提供的内置数据集之一。但是我当然需要使用自己的数据。

我知道有必要将其转换为长格式以便ggplot2能够使用它,但是我只是无法正确地做到这一点。而且,我对现有的所有不同数据处理程序包,某些功能似乎是其他功能的一部分或类似的东西感到困惑。

编辑:根据我最初的问题,我开始意识到用线图进行绘制将不起作用。至少我现在不这么认为。因此,这是绘制此数据集的图形化方法的模型(具有完全虚构的值):

Mock-up of a possible output format

颜色代表对choice的不同反应。

有人可以帮我吗?并且,如果您对以更好的方式可视化数据有任何建议,请分享!

2 个答案:

答案 0 :(得分:1)

不确定我是否正确理解了您想要的输出。.所以这是第一次尝试

library( tidyverse )

df2 <- df %>% 
  mutate( agegroup = as.factor( agegroup ) ) %>%
  group_by( ses, agegroup, sex, choice ) %>%
  summarise( count = n() )

#   ses   agegroup sex    choice    count
#   <fct> <fct>    <fct>  <fct>     <int>
# 1 A     2        Female square        1
# 2 A     2        Female triangle      2
# 3 B     3        Female circle        1
# 4 B     3        Female hodor         1
# 5 B     3        Female rectangle     1
# 6 B     3        Female square        2
# 7 B     3        Female triangle      1
# 8 C     2        Female circle        1
# 9 C     2        Female rectangle     1
# 10 C     2        Female square        2
# 11 D     5        Male   hodor         4

ggplot(df2, aes( x = ses, y = count, group=agegroup, colour = agegroup)) +
  geom_point( stat='summary', fun.y=sum) +
  stat_summary(fun.y=sum, geom="line") + 
  facet_grid( c("choice", "sex" ) )

enter image description here

答案 1 :(得分:0)

这显示了修订后的问题的点状图和堆积条形图。思考可视化的一些指导:您是否已经知道数据中的“故事”?如果不是,那么您可能需要遍历许多可视化来发现故事,构建最能显示故事的可视化。 df <-read.table(text ='subject selection agegroup sex ses 约翰广场2女A 约翰三角2女A 约翰三角2女A 玛丽圈2女C 玛丽广场2女C 玛丽矩形2女C 玛丽广场2女C 霍多尔霍多尔5男D 霍多尔霍多尔5男D 霍多尔霍多尔5男D 霍多尔霍多尔5男D 吉尔广场3女B 吉尔圈3女B 吉尔广场3女B Jill Hodor 3女B 吉尔三角3女B 吉尔矩形3母B',标头为TRUE) 图书馆(tidyverse) #>──附加包装──────────────────────────────────── ────────────tidyverse 1.2.1── #>✔ggplot2 2.2.1✔rr 0.2.4 #>✔小步1.4.2✔dplyr 0.7.4 #>✔tidyr 0.8.0✔纵梁1.3.0 #>✔读取器1.1.1✔forcats 0.3.0 #>──冲突────────────────────────────────────── ──────────────tidyverse_conflicts()── #>✖dplyr :: filter()屏蔽stats :: filter() #>✖dplyr :: lag()掩盖stats :: lag() #agegroup被读取为数字-转换为因子 df $ agegroup <-系数(df $ agegroup) #按主题创建数据框(检查数据问题!) df_subject <-df%>% group_by(主题,年龄段,ses,性别)%>% 总结() df_subject #>#小动作:4 x 4 #>#组:主题,年龄段,ses [?] #>主题年龄组ses sex #> #> 1 Hodor 5 D男 #> 2吉尔3 B女 #> 3约翰2女 #> 4玛丽2 C女 #按主题计算比例选择 df_subject_choice <-df%>% #按最好的小组汇总计数以进行分析 group_by(主题,选择)%>% 总结(n = n())%>% #根据计数计算比例 mutate(p = prop.table(n)) df_subject_choice #>#小动作:11 x 4 #>#组:主题[4] #>主题选择n p #> #> 1霍多尔霍多尔4 1.00 #> 2吉尔圆1 0.167 #> 3吉尔·霍多尔1 0.167 #> 4吉尔矩形1 0.167 #> 5吉尔广场2 0.333 #> 6吉尔三角1 0.167 #> 7约翰广场1 0.333 #> 8约翰三角形2 0.667 #> 9玛丽圈1 0.250 #> 10玛丽矩形1 0.250 #> 11玛丽广场2 0.500 #通过加入将结果汇总在一起 df_joined <-df_subject_choice%>% left_join(df_subject,by =“ subject”)%>% 选择(主题,ses,性别,年龄段,选择,p) df_joined #>#小动作:11 x 6 #>#组:主题[4] #>主题ses性别年龄组选择p #> #> 1个Hodor D男5个Hodor 1.00 #> 2吉尔B女3圈0.167 #> 3吉尔B女3霍多尔0.167 #> 4吉尔B女3矩形0.167 #> 5吉尔B女3平方0.333 #> 6吉尔B女3三角0.167 #> 7约翰A女2平方0.333 #> 8约翰A女2三角形0.667 #> 9玛丽C女2圈0.250 #> 10玛丽C女2矩形0.250 #> 11玛丽C女2平方0.500 #汇总到要分析的任何级别(请注意,这可以直接在ggplot中进行) df_summary <-df_joined%>% group_by(年龄组,ses,性别,选择)%>% 总结(p_mean =平均值(p)) df_summary #>#小动作:11 x 5 #>#组:年龄段,ses,性别[?] #>年龄段ses性别选择p_mean #> #> 1 2 A女方0.333 #> 2 2一个女性三角形0.667 #> 3 2 C内圈0.250 #> 4 2 C母矩形0.250 #> 5 2 C雌方0.500 #> 6 3 B内圈0.167 #> 7 3 B女臭味0.167 #> 8 3 B母矩形0.167 #> 9 3 B女方0.333 #> 10 3 B母三角形0.167 #> 11 5 D男霍多尔1.00 #绘图点 ggplot(df_summary,aes(x = ses,y =选择,color =年龄组,size = p_mean))+ geom_point()+ facet_wrap(〜sex) #切面100%堆叠的条形图 ggplot(df_summary,aes(x =年龄组,y = p_mean,颜色=选择,填充=选择))+ geom_col()+ facet_grid(sex〜ses)