labels on the pie chart for small pieces (ggplot)

2019-06-25 04:54发布

问题:

I want to make pie chart in ggplot

My data:

lab <- c("a", "b", "c", "d", "e", "f", "g", "h")
percentage <- c(50, 20, 10, 10, 2, 2,2,2)
df.prison <- data.frame(lab, percentage)
df.prison$crime <- factor(df.prison$lab, levels=rev(levels(df.prison$lab)))
labels.prison <- paste(lab, "-", percentage, "%", sep="")

Plot:

plot <- ggplot(data=df.prison, aes(x=factor(1), y=percentage, fill=factor(lab))) +
   geom_bar(width=1, stat="identity") +
   coord_polar(theta="y") +
   ylab("") +
   xlab("") +
   labs(fill="") +
   theme(axis.ticks = element_blank(), panel.grid  = element_blank(), axis.text = element_blank()) +
   geom_text(aes(y = percentage/2 + c(0, cumsum(percentage)[-length(percentage)]), label=labels.prison))
plot

I have two problems with this plot: 1. I don't want to have legend (because labels are very short (one letter) and I want to have them on the pie chart 2. Is it possible to place labels for the small pieces (smaller than few percentages) next to the plot, because the label in too big to place in inside this small piece. For example like here:

http://www.conceptdraw.com/How-To-Guide/picture/Pie-chart-Sector-weightings.png

Thanks for any advise :)

回答1:

legend.position = 'none' will remove the legend. You can adjust the labels by adjusting the x value with the mapping for geom_text.

library(ggplot2)

lab <- c("a", "b", "c", "d", "e", "f", "g", "h")
percentage <- c(50, 20, 10, 10, 2, 2, 2, 2)
df.prison <- data.frame(lab, percentage)
df.prison$crime <- factor(df.prison$lab, levels=rev(levels(df.prison$lab)))
labels.prison <- paste(lab, "-", percentage, "%", sep="")

ggplot(data=df.prison, aes(x=factor(1), y=percentage, fill=factor(lab))) +
   geom_bar(width=1, stat="identity") +
   coord_polar(theta="y") +
   ylab("") +
   xlab("") +
   labs(fill="") +
   theme(legend.position = "none",   ### Solution to part 1, no legend
         axis.ticks = element_blank(), 
         panel.grid = element_blank(), 
         axis.text  = element_blank()) +
   geom_text(aes(x = c(1, 1, 1, 1, 1.2, 1.3, 1.4, 1.5), # Solution for part 2,
                 y = percentage / 2 + c(0, cumsum(percentage)[-length(percentage)]), 
                 label=labels.prison))