【问题标题】:Creating a mosaic plot with percentages使用百分比创建马赛克图
【发布时间】:2021-03-03 05:14:42
【问题描述】:

以下是我拥有的示例数据集:

df <- structure(list(Class = c("A", "B", "C", "D"), 
`Attempted` = c(374, 820, 31, 108), 
`Missed` = c(291, 311, 5, 15), 
`Cancelled` = c(330, 206, 6, 5), 
`Unknown` = c(950, 341, 6, 13)), 
class = "data.frame", row.names = c(NA, -4L))

我想用“百分比”而不是绝对数字创建一个马赛克图。准确地说,我想看看“A 级”总人口中有多少“A 级”人“错过”了他们的考试?而且,对于其他阶层的人口也是如此。

我还没有尝试过任何代码,因为我完全不知道如何开始。谁能帮我解决这个问题?

【问题讨论】:

    标签: r ggplot2 mosaic-plot


    【解决方案1】:

    仅使用一个包,您可以这样做并注意我用每个类中的比例标记单元格(即行总和为 1):

    library(vcd)
    M = as.table(as.matrix(df[,-1]))
    names(dimnames(M)) = c("Class","result")
    labs <- round(prop.table(M,margin=1), 2)
    mosaic(M, pop = FALSE)
    labeling_cells(text = labs, margin = 0)(M)
    

    你也可以用一个简单的可视化它

    library(RColorBrewer)
    barplot(t(labs),col=brewer.pal(4,"Set2"))
    
    legend("bottomright",legend = colnames(labs),inset=c(0,1.1), xpd=TRUE, 
           fill =brewer.pal(4,"Set2"),horiz=TRUE,cex=0.7)
    

    如果你使用 ggplot2 和其他 gg 东西,你需要把你的数据转长:

    library(tidyr)
    library(dplyr)
    library(ggplot2)
    
    df_long = df %>% 
    pivot_longer(-Class) %>% 
    group_by(Class) %>% 
    mutate(total = sum(value),
           p = round(100*value/total,digits=1)) %>%
    ungroup()
    
    ggplot(df_long,aes(x=Class,y=p,fill=name)) + geom_col() + geom_text(aes(label=p),position=position_stack(vjust=0.2))
    

    如果你想使用ggplot2,你需要修改这个answer by z.lin,注意我取sqrt是为了让更小的地块更明显:

    ggplot(df_long,
           aes(x = Class, y = p, width = sqrt(total), fill = name)) +
    geom_col(colour = "black") +
    geom_text(aes(label = p), position = position_stack(vjust = 0.5)) + 
    facet_grid(~Class, scales = "free_x", space = "free_x") +
    theme_void()
    

    【讨论】:

    • 感谢@StupidWolf,感谢您的时间和努力。这是对我的问题的一个非常详尽的答案。它拯救了我的一天。
    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多