某天突然遇到要用ggplot2画饼图,画的时候发现图形有问题。数据集是这样的:
dt = data.frame(A = c(10, 4, 3, 2, 1), B = c('A','B','C','D','E'))
效果是这样的:
很明显,饼图的坐标和图形的方向是相反的,这是因为标签坐标计算反了方向。
原来的生成图形代码如下:
library(ggplot2)
dt = data.frame(A = c(10, 4, 3, 2, 1), B = c('A','B','C','D','E'))
# 文本相对于y周的位置
txt_of_y <- 0.8dt = dt[order(dt$A, decreasing = TRUE),]
myLabel = as.vector(dt$B)
myLabel = paste(myLabel, "(", round(dt$A / sum(dt$A) * 100, 2), "%)", sep = "")
p = ggplot(dt, aes(x = "", y = A, fill = B)) +
geom_bar(stat = "identity", width = 1) +
coord_polar(theta = "y",start = 0, direction = -1) +
labs(x = "", y = "", title = "") +
theme(axis.ticks = element_blank()) +
theme(legend.title = element_blank(), legend.position = "none") +
scale_fill_discrete(breaks = dt$B, labels = myLabel) +
theme(axis.text.x = element_blank()) +
## 在图中加上百分比:x 调节标签到圆心的距离, y 调节标签的左右位置
geom_text(aes(y = c(0,cumsum(A)[-length(A)])+A/2,
x = 1/txt_of_y, label = myLabel), size = 3)
p
需要修改geom_text()中的参数,反转坐标轴即对应的标签位置,如下实现:
geom_text(aes(y = rev(c(0,cumsum(rev(A))[-length(A)])+rev(A/2)),
x = 1/txt_of_y, label = myLabel), size = 3)
修改后的图形已经正常。