2016-12-27 74 views
2

我的數據幀貌似添加比例標籤

df 
    Group value 
1 Positive 52 
2 Negative 239 
3 Neutral  9 

我想提出使用ggplot數據幀的餅圖。

pie <- ggplot(df, aes(x="", y=value, fill=Group)) + 
     geom_bar(width = 1, stat = "identity") + 
     coord_polar("y", start=0) 

這是我的餅圖。

enter image description here

但是當我嘗試圖表

pie <- ggplot(df, aes(x="", y=value, fill=Group)) + 
     geom_bar(width = 1, stat = "identity") + 
     coord_polar("y", start=0) + 
     geom_text(aes(y = value/2 + c(0, cumsum(value)[-length(value)]), 
       label = percent(value/300)), size=5) 

上加個標籤,這是我的結果。

enter image description here

我已經看到許多相同的問題礦山,即R + ggplot2 => add labels on facet pie chart和解決方案沒有幫助。

回答

2

我同意@hrbrmstr華夫餅圖會更好。但要回答最初的問題......你的問題來自楔子的繪製順序,這將默認爲按字母順序排列。當你根據數據框中的順序來計算標籤的放置位置時,這是錯誤的。

作爲可讀性的一般原則,在實際代碼繪製圖形之前,對標籤和位置進行所有花哨的計算。

library(dplyr) 
library(ggplot2) 
library(ggmap) # for theme_nothing 
df <- data.frame(value = c(52, 239, 9), 
       Group = c("Positive", "Negative", "Neutral")) %>% 
    # factor levels need to be the opposite order of the cumulative sum of the values 
    mutate(Group = factor(Group, levels = c("Neutral", "Negative", "Positive")), 
      cumulative = cumsum(value), 
      midpoint = cumulative - value/2, 
      label = paste0(Group, " ", round(value/sum(value) * 100, 1), "%")) 

ggplot(df, aes(x = 1, weight = value, fill = Group)) + 
    geom_bar(width = 1, position = "stack") + 
    coord_polar(theta = "y") + 
    geom_text(aes(x = 1.3, y = midpoint, label = label)) + 
    theme_nothing()    

enter image description here

+0

我認爲正面和負面的百分比標籤在您的圖形中是相反的。 – jazzurro

+1

感謝@jazzurro,我現在糾正它。代碼很好,我在原始數據框中輸入了錯誤的數字。如果OP包含一個可重複的例子,我不會犯這個錯字。 –

+0

它的工作。謝謝@PeterEllis,你救了我一命:) –

4

如何:

vals <- c(239, 52, 9) 
val_names <- sprintf("%s (%s)", c("Negative", "Positive", "Neutral"), scales::percent(round(vals/sum(vals), 2))) 
names(vals) <- val_names 

waffle::waffle(vals) + 
    ggthemes::scale_fill_tableau(name=NULL) 

enter image description here

呢?

它比餅圖「更新鮮」,而且您現在還沒有真正獲得任何與您在這些餅圖標籤上擁有/想要的精度水平相關的任何內容。

+0

同意。但問題是,這張圖表來自我最後一年的項目,當我提交項目論文時,我使用了餅圖。現在我無法改變圖表。 它工作的很好,那麼我不會發生什麼只是代碼。 無論如何感謝 –

2

這裏是一個想法匹配組的餅圖中的順序和標籤的順序。我按value降序排序數據。我也提前計算了百分比。當我繪製ggplot圖時,我使用fct_inorder()mydf(即負值,正值和中性)的順序指定了Group的順序。當geom_label_repel()向餅圖添加標籤時,標籤的順序與餅圖的順序相同。

library(dplyr) 
library(ggplot2) 
library(ggrepel) 
library(forcats) 
library(scales) 

mydf %>% 
arrange(desc(value)) %>% 
mutate(prop = percent(value/sum(value))) -> mydf 

pie <- ggplot(mydf, aes(x = "", y = value, fill = fct_inorder(Group))) + 
     geom_bar(width = 1, stat = "identity") + 
     coord_polar("y", start = 0) + 
     geom_label_repel(aes(label = prop), size=5, show.legend = F, nudge_x = 1) + 
     guides(fill = guide_legend(title = "Group")) 

enter image description here

DATA

mydf <- structure(list(Group = structure(c(3L, 1L, 2L), .Label = c("Negative", 
"Neutral", "Positive"), class = "factor"), value = c(52L, 239L, 
9L)), .Names = c("Group", "value"), class = "data.frame", row.names = c("1", 
"2", "3")) 
0

例如,我創建400輛一個數據幀E3:

e3 <- data.frame(400) 
e3 <- rep(c("car", "truck", "other", "bike", "suv"), c(60, 120, 20, 50, 150)) 

由於餅圖是比例非常有用,讓我們看看我們車輛的比例,我們會在圖表上報告這種情況下:

paste(prop.table(table(e3))*100, "%", sep = "") 
[1] "15%" "5%" "30%" "12.5%" "37.5%" 

然後你就可以畫出你的餅圖,

pie(table(e3), labels = paste(round(prop.table(table(e3))*100), "%", sep = ""), 
col = heat.colors(5), main = "Vehicles proportions - n: 400") 

enter image description here

+0

哎呀,我忘了ggplo2,對不起! – Worice