2016-08-25 96 views
1

我想在R中爲barplot做兩個分類變量,Dep_meds_at_time_of_rx_2phq9_catphq9_cat有兩個級別,01,其中0對應於PHQ-L1對應於PHQ-H有條件分組的barplot R

這裏是我的代碼:

# 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欄的barplot。

我已經用盡任何聰明的技巧,我已經知道了這樣的作爲使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") 

回答

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」的標籤,你可以通過與unname(pcnts)更換pcnts[2, ]做到這一點第一行:

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

enter image description here

+0

不要忘了選擇pcnts'的'第二行text()命令,否則你會得到重疊的標籤。 – jkeirstead

+0

贊,謝謝。我有,但必須複製早期版本。 – lmo

+0

謝謝!這很棒。不知道爲什麼我不記得如何選擇表格的第二行。我會假裝它是星期一。 – nchimato

1

你只需要選擇您的百分比表,例如第二行

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

這正是我所需要的。提高了一個,但有人很快就得到了答案。謝謝! – nchimato

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

,或者你可以我想我會在ggplot2答案扔顏色更改爲白色

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

enter image description here

+0

Up投票使用'width'和'space'參數,我之前沒有看過那個組合。這些標籤只是不與酒吧居中。看起來像選擇'pcnts'的第二排是我正在尋找的。謝謝! – nchimato

2

。該解決方案確保了在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

+0

這真的很有用,因爲我也嘗試在'ggplot'中弄清楚它。我將不得不在下次嘗試。謝謝你的信息! – nchimato