ggplot2饼图标签中出现意外行为

DSA*_*DSA 6 r ggplot2 labeling pie-chart

我在这里检查了其他问题,但我看不出这个问题.我有标签问题.奇怪的是,除了一个标签之外,所有标签的代码都运行良好.当我检查数据集时(这非常简单),一切看起来都很好(一列有因子变量,另一列有数字).

这很奇怪,因为它适用于具有相同结构的其他一些数据.但是,我尝试/检查了一切,但无法解决这个问题.这是问题所在:

library(ggplot2)
library(ggrepel)

df = data.frame(
  status = c("Oak", "maple", "walnut", "Pine"),
  value = c( 47.54, 37.70, 11.48, 3.28))

ggplot(df, aes(x = "" , y = value, fill = fct_inorder(status))) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar(theta = "y", start = 0 ) +
  scale_fill_brewer(palette = "Set3", direction = -4) +
  geom_label_repel(aes(label = paste0(value, "%")), size=4, show.legend = F, nudge_x = 1) +
  guides(fill = guide_legend(title = "Status")) +
  theme_void()
Run Code Online (Sandbox Code Playgroud)

其中一个标签提出了一个问题

如果我至少有一个建议来尝试或解释这种奇怪的行为,那就太好了.

显然,通过新的ggplot2更新,他们在不提供任何额外位置数据的情况下计算出位置问题,但不知何故,如果由于技术限制而无法使用它,这可能有助于解决此类问题.

Ric*_*ord 5

我认为问题在于,geom_bar(或更好geom_col)默认为,position = stack而默认为geom_text_repel。设置geom_text_repelposition= "stack"将标签放在饼图的每个部分的末尾而不是中点。

可以预先计算位置。以下代码适用于显示的数据,但可能并不通用,因为它取决于行的顺序。

library(ggplot2)
library(ggrepel)

df = data.frame(
  status = c("Oak", "maple", "walnut", "Pine"),
  value = c( 47.54, 37.70, 11.48, 3.28))

df2 <- df %>% 
  mutate(
    cs = rev(cumsum(rev(value))), 
    pos = value/2 + lead(cs, 1),
    pos = if_else(is.na(pos), value/2, pos))

ggplot(df, aes(x = "" , y = value, fill = fct_inorder(status))) +
  geom_col(width = 1) +
  coord_polar(theta = "y", start = 0 ) +
  scale_fill_brewer(palette = "Set3", direction = -4) +
  geom_label_repel(aes(y = pos, label = paste0(value, "%")), data = df2, size=4, show.legend = F, nudge_x = 1) +
  guides(fill = guide_legend(title = "Status")) +
  theme_void()
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,一种无需手动计算即可在条形中点获取标签的方法是使用“ position = position_stack(vjust = .5)”。(这不能解决问题,因为不能同时使用“ position_stack()”和“ position_nudge()”。) (2认同)