2017-01-17 36 views
2

我是R的全新品牌。我需要繪製一張餅圖。現在我已經盡力了,但它並沒有爲我生成餅圖。以下是我的代碼。如何從相對頻率的表中繪製R中的餅圖?

socialIssue <- matrix(c(245,112,153,71,133,306),ncol=1,byrow=T) 
rownames(socialIssue) <- c("Housing","Transportation","Health Care","Education","Food","Other") 
colnames(socialIssue) <- c("Frequency") 
socialIssue <- as.table(socialIssue) 
socialIssue/sum(socialIssue) 

cols <- rainbow(nrow(socialIssue)) 
pie(socialIssue$Frequency, labels=paste0(round(socialIssue$Frequency/sum(socialIssue$Frequency)*100,2),"%"),colnames=cols) 

這是以下輸出。輸出的頻率是正確的。

socialIssue <- matrix(c(245,112,153,71,133,306),ncol=1,byrow=T) 
> rownames(socialIssue) <- c("Housing","Transportation","Health Care","Education","Food","Other") 
> colnames(socialIssue) <- c("Frequency") 
> socialIssue <- as.table(socialIssue) 
> socialIssue/sum(socialIssue) 
       Frequency 
Housing  0.24019608 
Transportation 0.10980392 
Health Care 0.15000000 
Education  0.06960784 
Food   0.13039216 
Other   0.30000000 
> 
> cols <- rainbow(nrow(socialIssue)) 
> pie(socialIssue$Frequency, labels=paste0(round(socialIssue$Frequency/sum(socialIssue$Frequency)*100,2),"%"),colnames=cols) 
Error in socialIssue$Frequency : $ operator is invalid for atomic vectors 

回答

1

轉換爲數據幀,然後繪製

socialIssue = as.data.frame(socialIssue) 
socialIssue$percent = round(100*socialIssue$Freq/sum(socialIssue$Freq), digits = 1) 
socialIssue$label = paste(socialIssue$Var1," (", socialIssue$percent,"%)", sep = "") 
pie(socialIssue$Freq, labels = socialIssue$label, col = cols) 

enter image description here

+0

THANK YOU SO MUCH – user372204

2

該做的:

pie(socialIssue[, 1], 
    labels = paste0(round(socialIssue[, 1]/sum(socialIssue[, 1]) * 100, 2), "%")) 

因爲你有一個矩陣,而不是一個數據幀。

+0

謝謝你......但有什麼辦法,我可以寫我的圖表的標題,也表明在底部的傳說。圖例應該說明類別和百分比應顯示在餅圖上。 – user372204

2

prop.table照顧%計算 - sprintf處理數值的格式,所以您有一致的小數位數。

所有轉換代碼的不需要任一:

socialIssue <- matrix(c(245,112,153,71,133,306),ncol=1,byrow=T) 
pie(socialIssue, labels=sprintf("%.2f%%", prop.table(socialIssue)*100)) 
1

隨着基R,與所述色彩時使用(在PARAM NAME應cols代替`colnames')中,用圖例加入:

pie(socialIssue[,1], labels=paste0(round(socialIssue/sum(socialIssue)*100,2),"%"),col=cols) 
legend('bottomright', legend=rownames(socialIssue), fill=cols, bty='n') 

enter image description here

ggplot2

socialIssue <- matrix(c(245,112,153,71,133,306),ncol=1,byrow=T) 
rownames(socialIssue) <- c("Housing","Transportation","Health Care","Education","Food","Other") 
colnames(socialIssue) <- c("Frequency") 
library(ggplot2) 
library(scales) 
ggplot(as.data.frame(socialIssue), aes(x='',y=Frequency, fill=as.factor(Frequency))) + 
    geom_bar(width=1, stat='identity') + 
    scale_fill_manual(values=cols, labels=rownames(socialIssue)) + 
    scale_y_continuous(labels=percent) + 
    coord_polar(theta = "y") + theme_bw() 

enter image description here

+0

非常感謝 – user372204