我的数据框架似乎是
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)
这是我的饼图。
但是当我尝试在图表上添加百分比标签时
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)
这是我的结果。
我已经看到了许多与我同样的问题,即R + ggplot2 => add labels on facet pie chart ,解决方案没有帮助。
答案 0 :(得分:6)
怎么样:
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)
代替?
它&#34;更新鲜&#34;而不是饼图,你现在对这些饼图标签的精确程度并不高。
答案 1 :(得分:3)
这是一个匹配饼图中的组顺序和标签顺序的想法。我按value
的降序对数据进行了排序。我还事先计算了这个百分比。当我绘制ggplot数字时,我使用Group
以mydf
(即,负数,正数和中性)的顺序指定了fct_inorder()
的顺序。当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"))
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"))
答案 2 :(得分: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()
答案 3 :(得分:2)
例如,我创建了一个包含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")
答案 4 :(得分:0)
这是我的示例,仅使用基本R代码。希望对您有帮助。
以虹膜为例attach(iris)
检查虹膜/物种的比率
a<- table(iris$Species)
class(a)
然后将表格式转换为矩阵以便使用行名代码
a_mat<- as.matrix(a)
a_mat
计算每种物种的比例
a_ratio<- a_mat[,1]/sum(a_mat[,1])*100
a_ratio
由于每个物种所占的比例为0.33333(即33.33333%),因此我只想使用signif()小数点后两位
a_ratio<- signif(a_ratio,3)
a_ratio
R base的基本饼图代码
pie(a_ratio,labels=rownames(a_mat))
通过使用paste()将比率值进一步添加到标签上
pie(a_ratio,labels=paste(rownames(a_mat),c("33%","33%","34%")))