如何解决将文本旋转到圆心指定合适角度的问题
我在将文字旋转到圆圈中时遇到问题。就像在Adding labels to pie chart in R... Radiating "spokes"?中一样。在示例中,我尝试做出类似的思考,但我对解决方案不太了解。
rotate=function(vec){
df<-data.frame(table(vec))
colnames(df)[1]<-'group'
angle_diff<-30
#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",palette='Dark2') + 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))),')')),angle=angle_diff),size=5)
}
rotate(c(rep(3,30),rep(4,40),rep(5,70),rep(6,60)))
我们可以看到饼状图的粉红色部分看起来不错,而不是其他。我试图固定适当的角度,该角度将适用于馅饼的所有部分,但我没有做到这一点。让我们注意到,对于橙色部分,角度变化应该非常接近0,而对于绿色部分,角度变化应该大于180。是否有任何想法可以固定这个合适的角度?
谢谢!
解决方法
角度的计算有些棘手。您需要计算每个切片的中心,这是频率的总和减去宽度的一半。然后重新缩放到360度(除以最大值,再除以360),最后加90度以使文本向外(而不是垂直)。
理想情况下,可以使用position_stack
内部计算出的标签位置来做到这一点,但我不知道如何使用after_stat
或after_scale
来使其正常工作。
rotate <- function(vec){
require(ggplot2)
require(scales)
df <- as.data.frame(table(vec))
colnames(df)[1] <- 'group'
df$label <- paste0(df$Freq,' (',percent(df$Freq / sum(df$Freq)),')')
df$angle <- (cumsum(df$Freq) - 0.5 * df$Freq) / sum(df$Freq) * 360 + 90
ggplot(df,aes(x = "",y = Freq,fill = group)) +
geom_col(width = 1,show.legend = FALSE) +
geom_text(
aes(label = label,angle = angle),position = position_stack(vjust = 0.5),size = 5
) +
coord_polar("y",start = 0) +
theme_void()
}
rotate(c(rep(3,30),rep(4,40),rep(5,70),rep(6,60)))
如果您希望文本始终在右侧,则需要使用模数检查计算的角度是否超过180度。因此将角度计算更改为:
df$angle <- ((cumsum(df$Freq) - 0.5 * df$Freq) / sum(df$Freq) * 360) %% 180 - 90
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。