0

我有一个数据框,我想从中制作一个显示 % 标签的饼图

这是我首先做的

SubSegment<- c('S1','S2','S3','S4')
v <- c(100, 300, 500, 200)
df<- cbind.data.frame(SubSegment, v)

#calculations for % labels in chart
df <- df %>% 
  arrange(desc(SubSegment)) %>%
  mutate(prop = v / sum(df$v)) %>%
  mutate(ypos = cumsum(prop)- 0.5*prop ) %>%
  mutate(label= prop*1)
df[5] = sapply(df[5], function(x) scales::percent(x, accuracy = 0.1))

plot.ex <- ggplot(df, aes(x = "", y = prop, fill = SubSegment)) +
  geom_bar(width = 1, stat = "identity", color="white", alpha=0.8) +
  coord_polar("y", start = 0) +
  theme_void() + 
  geom_text(aes(y = ypos, label = label), size=3, color = "white") +
  scale_fill_brewer(palette="Set1") 

结果: 在此处输入图像描述

如您所见,标签看起来很棒,而且它们在正确的位置,但令我困扰的是因素的顺序是按字母顺序排列的,我希望具有最大价值的公司首先显示在图例中,所以我添加了一行剧情前的代码:

df$SubSegment <- factor(df$SubSegment, levels=df$SubSegment[order(-(df$prop))], ordered=TRUE)

这样做之后,情节图例中的因素的顺序是我想要的,但是标签都弄乱了(它们不会随着馅饼块相应地移动)。

这是我的第二个饼图的样子: 在此处输入图像描述

基本上我想知道如何编辑我的ypos行,以便在饼图移动时标签会相应移动。

4

1 回答 1

1

您想根据其比例显示子细分,因此应根据您的比例计算您ypos的。这可以通过更改您的arrange()线路来简单地完成:

df <- df %>% 
  mutate(prop = v / sum(df$v), 
         label= scales::percent(prop, accuracy = 0.1)) %>% 
  arrange(prop) %>% 
  mutate(ypos = cumsum(prop)- 0.5*prop, 
         SubSegment = factor(SubSegment, levels=SubSegment[order(-(prop))], ordered=TRUE))



ggplot(df, aes(x = "", y = prop, fill = SubSegment)) +
  geom_bar(width = 1, stat = "identity", color="white", alpha=0.8) +
  coord_polar("y", start = 0) +
  theme_void() + 
  geom_text(aes(y = ypos, label = label), size=3, color = "white") +
  scale_fill_brewer(palette="Set1")

饼形图

于 2022-02-13T13:00:58.677 回答