【问题标题】:Conditional grouped barplot R条件分组条形图 R
【发布时间】:2017-01-02 01:33:50
【问题描述】:

我正在尝试在 R 中为两个分类变量 Dep_meds_at_time_of_rx_2phq9_cat 创建一个 barplotphq9_cat有两个层次,01,其中0对应PHQ-L1对应PHQ-H

这是我的代码:

# get counts of vars
counts <- table(data2$Dep_meds_at_time_of_rx_2, data2$phq9_cat)

# get percentages of vars
pcnts <- scale(counts, FALSE, colSums(counts))*100

# plot barplot
bp <- barplot(pcnts, beside=TRUE, col=c("azure3", "azure4"), ylab="Frequency (%)", border=NA)
legend("topright", legend=c("PHQ-L", "PHQ-H"), bty="n", fill=c("azure3", "azure4"), border=NA)
text(bp, 1, round(pcnts, 2), cex=1, pos=3, col=c("black"))

以及由此产生的情节:

这太棒了!但我只需要绘制data2$Dep_meds_at_time_of_rx_2==1 类别。所以我想要一个只有3.03 条和19.44 条的条形图。

我已经用尽了我所知道的任何巧妙技巧,例如将data2$Dep_meds_at_time_of_rx_2==0 条设置为白色并使用space = c(-1, 0) 使data2$Dep_meds_at_time_of_rx_2==1 条条彼此相邻,但是条条非常宽,就像这样:

我只需要data2$Dep_meds_at_time_of_rx_2==1 列,但宽度正常。

有什么想法吗?

这是我的数据:

> dput(data2)
structure(list(Dep_meds_at_time_of_rx_2 = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 
0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 
0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L), phq9_cat = c(1L, 
1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L)), .Names = c("Dep_meds_at_time_of_rx_2", "phq9_cat"), row.names = c(NA, 
-243L), class = "data.frame")

【问题讨论】:

    标签: r conditional bar-chart


    【解决方案1】:

    这是对您所拥有的内容的小修改。我认为它接近完成你想要的:

    bp <- barplot(pcnts[2,], beside=TRUE, col=c("azure3", "azure4"), ylab="Frequency (%)",
                  border=NA)
    legend("topleft", legend=c("PHQ-L", "PHQ-H"), bty="n", fill=c("azure3", "azure4"), border=NA)
    text(bp[], 1, round(pcnts[2,], 2), cex=1, pos=3, col=c("black"))
    

    请注意,如果希望在 x 轴上放置“0”“1”标签,您可以通过将第一行中的 pcnts[2, ] 替换为 unname(pcnts) 来完成此操作:

    bp <- barplot(unname(pcnts[2, ]), beside=TRUE, col=c("azure3", "azure4"),
                  ylab="Frequency (%)", border=NA)
    

    【讨论】:

    • 别忘了在 text() 命令中选择pcnts 的第二行,否则你会得到重叠的标签。
    • 好的,谢谢。我有,但一定是复制了早期版本。
    • 谢谢!这很棒。不知道为什么我不记得如何选择表格的第二行。我会假装今天是星期一。
    • x 轴的两个标签不应该都是 1 吗?
    • @bouncyball 看起来标签是从pcnts的列名中拉出来的,也就是变量data2$phq9_cat。使用不同的标签可能比使用统一的标签更能提供信息。
    【解决方案2】:

    我想我会抛出一个ggplot2 的答案。此解决方案确保 x 轴上的两个标签均为 1 - 反映抗抑郁药使用状态:

    library(ggplot2)
    
    df1 <- data.frame(Frequency = pcnts[2,],
                       PHQ = c('PHQ-L','PHQ-H'))
    
    ggplot(df1, aes(x = 1, y = Frequency))+
        geom_bar(stat = 'identity', aes(fill = PHQ), 
                 position = position_dodge(width = 1))+
        scale_fill_manual(values = c('PHQ-L' = 'azure3',
                                     'PHQ-H' = 'azure4'),
                          name = '')+
        scale_x_continuous(breaks = c(.75, 1.25),
                           labels = c(1,1))+
        xlab('Anti-Depressant use at time of treatment')+
        ylab('Frequency (%)')+
        geom_text(x = .75, y = 2.5, label = '19.44%')+
        geom_text(x = 1.25, y = 2.5, label = '3.03%')+
        theme_bw()
    

    【讨论】:

    • 这真的很有用,因为我也尝试在ggplot 中找到它。下次我得试试这个。谢谢你的信息!
    【解决方案3】:

    您只需要选择百分比表的第二行,例如

    # get percentages of vars
    pcnts <- scale(counts, FALSE, colSums(counts))*100
    # Filter for the results you want
    pcnts <- pcnts[2, ]
    # Plot as before
    

    【讨论】:

    • 这正是我所需要的。增加了一个,但有人更快地得到了答案。谢谢!
    【解决方案4】:

    如果你想实现窄条,那么宽度和空间参数的组合就可以解决问题。

    barplot(pcnts, beside=TRUE, col=c("azure3", "azure4"), ylab="Frequency (%)", border=NA, width = c(0,.51, 0,0.51), space = c(1,2))
    

    或者您可以将颜色更改为白色

    barplot(pcnts, beside=TRUE, col=c("white", "azure4"), ylab="Frequency (%)", border=NA,  space = c(1,2))
    

    【讨论】:

    • 赞成使用widthspace 参数,我以前没有看过那个组合。标签只是没有以条为中心。看起来选择pcnts 的第二行是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2021-04-22
    • 2021-10-01
    • 1970-01-01
    • 2016-04-08
    • 2021-01-17
    相关资源
    最近更新 更多