【问题标题】:ggplot + scale_size_area , how show proportions from another cat variableggplot + scale_size_area ,如何显示另一个猫变量的比例
【发布时间】:2016-12-20 12:05:05
【问题描述】:

成功绘制分类数据与分类数据后

ggplot(data=data_big, aes(job, education)) +
  geom_count() +
  scale_size_area(max_size = 12)+
  theme_bw()+
  theme(axis.text.x=element_text(angle=45,hjust=1))

我希望添加一个维度,使这些点成为“迷你饼图”。基本上我想添加有关另一个(二进制)分类数据的信息。

我用

计算了这些比例
data_big %>% group_by(job,education,y) %>% summarise(n=n()) %>% mutate(rel.freq  = round(100 * n/sum(n), 2)))

给出一个类似(不完整的tbl)的表格

工作教育 y/n q rel.freq

admin. illiterate no 1 100.00
admin. basic.4y yes 10 12.99
admin. basic.4y no 67 87.01
admin. basic.6y yes 8 5.30
admin. basic.6y no 143 94.70
admin. basic.9y yes 42 8.42
admin. basic.9y no 457 91.58
admin. high.school yes 382 11.47
admin. high.school no 2947 88.53
admin. professional.course yes 49 13.50
admin. professional.course no 314 86.50
admin. university.degree yes 823 14.31
admin. university.degree no 4930 85.69
admin. unknown yes 38 15.26
admin. unknown no 211 84.74
blue-collar illiterate no 8 100.00
blue-collar basic.4y yes 123 5.31
blue-collar basic.4y no 2195 94.69
blue-collar basic.6y yes 107 7.50
blue-collar basic.6y no 1319 92.50
blue-collar basic.9y yes 240 6.62
blue-collar basic.9y no 3383 93.38
blue-collar high.school yes 94 10.71
blue-collar high.school no 784 89.29
blue-collar professional.course yes 41 9.05
blue-collar professional.course no 412 90.95
blue-collar university.degree yes 9 9.57
blue-collar university.degree no 85 90.43
blue-collar unknown yes 24 5.29
blue-collar unknown no 430 94.71
entrepreneur illiterate yes 1 50.00
entrepreneur illiterate no 1 50.00

如何将 rel.freq 数据添加到我的第一个图中?

我尝试过的:

但不知何故,它解释了如何根据“初始”类别之一而不是第三个类别来显示比例。

编辑:在与@Nathan 交流后,他为我指明了更好的方向,我设法做到了:

final

【问题讨论】:

标签: r ggplot2


【解决方案1】:

只需将geom_count 抛在脑后,然后按照它在新列中所做的工作:

# added a few new rows for multiple jobs
job     education   y/n q   rel.freq
admin.  illiterate  no  1   100.00
admin.  basic.4y    yes 10  12.99
admin.  basic.4y    no  67  87.01
admin.  basic.6y    yes 8   5.30
admin.  basic.6y    no  143 94.70
admin.  basic.9y    yes 42  8.42
tech    basic.9y    no  22  10
tech    basic.4y    no  58  50

也许你想在这里改用sum(q)

# this is all geom_count really does but it's ornery with aes(fill)
data_big <- data_big %>% group_by(education, job) %>% mutate(cnt = sum(q))

# color for effect
ggplot(data=data_big, aes(job, education)) +
    geom_point(aes(size = cnt, fill = rel.freq),shape = 21) +
    scale_size_area(max_size = 12, name = "Count")+
    scale_fill_distiller(palette = "RdBu", name = "Rel.Freq") +
    theme_bw()+
    theme(axis.text.x=element_text(angle=45,hjust=1))

或者您可以利用分面显示data_big$y/n,如下所示:

data_big <- data_big %>% group_by(education, job, `y/n`) %>% mutate(cnt = sum(q))

ggplot(data=data_big, aes(job, education)) +
    geom_point(aes(size = cnt, fill = rel.freq),shape = 21) +
    scale_size_area(max_size = 12, name = "Count")+
    scale_fill_distiller(palette = "RdBu", name = "Rel.Freq") +
    theme_bw()+
    facet_wrap(~`y/n`) +
    theme(axis.text.x=element_text(angle=45,hjust=1))

【讨论】:

  • 嘿@Nathan Day,谢谢。计数似乎很奇怪 1) admin + basic.4y 的计数总数为 77 2) admin + basic.6y 的计数总数为 151
  • 嘿@Nathan Day,谢谢。计数似乎很奇怪 1. admin + basic.4y 的计数总数为 77 2. admin + basic.6y 的计数总数为 151 但这里的区域是相同的(并且标签指向的值要低得多)
  • 已使用 sum(q) 更新,但 hrbrmstr 的评论可能是您未来的一个更有希望的解决方案
  • 感谢您的初步回复,我已经找到了合适的答案。我所做的是,像你一样,取一个总和(q)。但问题是每个(工作与教育)有两条线,一条代表是,一条代表否。幸运的是,我可以过滤表格,只取带有 Y 的行(因为二元性,一行有另一行的信息;)
  • 刻面也很有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 2020-12-04
  • 2019-09-05
相关资源
最近更新 更多