更改饼图中文本相对于半径的角度

问题描述

我有一个关于在饼图中放置文本的问题。下面有一个代码

library(ggplot2)
pie_chart=function(vec){
  if (class(vec)=='numeric'){vec<-as.character(vec)
  vec<-print(paste('var',vec))
  }
  #creating data frame : variables and number of their occurrences
  df<-data.frame(table(vec))
  colnames(df)[1]<-'group'
  #creating bar plot first
  bp<- ggplot(df,aes(x="",y=Freq,fill=group))+
    geom_bar(width = 1,stat = "identity")
  blank_theme <- theme_minimal()+
    theme(
      axis.title.x = element_blank(),axis.title.y = element_blank(),panel.border = element_blank(),panel.grid=element_blank(),axis.ticks = element_blank(),plot.title=element_text(size=14,face="bold")
    )
  #adding polar coordinates to make a circle
  pie <- bp + coord_polar("y",start=0)
  pie + scale_fill_brewer("Characteristic") + blank_theme +
    theme(axis.text.x=element_blank())+
    geom_text(aes(y = rev(Freq)/2 + c(0,cumsum(rev(Freq))[-length(Freq)]),label = print(paste0(rev(Freq),'(',percent(rev(Freq)/(sum(Freq))),')'))),size=5)
  
}



pie_chart(c(rep(1,40),rep(2,30),rep(3,60),rep(4,50)))

enter image description here

如您所见,它看起来像上面。对于每一块馅饼,文本都是水平的。有什么办法可以改变它?让我们在行中间添加一个限制饼图的文本。即我想在下面的图片中像线条一样放置文本。

enter image description here

你知道如何做吗?

先谢谢!

解决方法

您需要为馅饼创建一个角度变量,就像位置变量一样,然后在geom_text中使用它来设置相对于圆中365度的角度。

例如如果我们将其添加到https://www.r-graph-gallery.com/piechart-ggplot2.html的示例中,则看起来像这样:

library(ggplot2)
library(dplyr)

# Create Data
data <- data.frame(
  group=LETTERS[1:5],value=c(13,7,9,21,2)
)

# Compute the position of labels
data <- 
  data %>% 
  arrange(desc(group)) %>%
  mutate(prop = value / sum(data$value) *100) %>%
  mutate(ypos = cumsum(prop)- 0.5*prop) %>% 
  mutate(yang = 90-(ypos/100*365))  # Create an angle variable relative to the the text position

# Basic piechart
ggplot(data,aes(x="",y=prop,fill=group)) +
  geom_bar(stat="identity",width=1,color="white") +
  coord_polar("y",start=0) +
  theme_void() + 
  theme(legend.position="none") +
  geom_text(aes(y = ypos,label = group,angle = yang),color = "white",size=6) # add angle