条件分组条形图R.

时间:2016-08-25 14:42:59

标签: r conditional bar-chart

我正在尝试为R中的barplot创建两个分类变量Dep_meds_at_time_of_rx_2phq9_catphq9_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"))

由此产生的情节:

enter image description here

哪个好极了!但我只需要绘制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栏彼此相邻,但随后就是吧超宽,如此:

enter image description here

我只需要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")

4 个答案:

答案 0 :(得分:2)

这是对你所拥有的一个小修改。我认为它已接近完成你想要的东西:

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)

enter image description here

答案 1 :(得分: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()

enter image description here

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

如果你想要实现窄条,那么宽度和空间参数的组合将起到作用。

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

enter image description here

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

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

enter image description here