ggplot2 饼图:通过将 ggrepel 切片标签移向饼图的圆周可以重新定位它们吗?

ggplot2 pie chart : Repositioning ggrepel slice labels by moving them toward circumference of the pie possible?

我正在尝试使用 ggplot2 创建以下 data.table obj 的饼图;

> pietable
                       cluster N P p
     1:                      1 962 17.4  8.70
     2:                      3 611 11.1 22.95
     3:                     10 343  6.2 31.60
     4:                     12 306  5.5 37.45
     5:                      8 290  5.2 42.80
     6:                      5 288  5.2 48.00
     7:                      7 259  4.7 52.95
     8:                     18 210  3.8 57.20
     9:                      4 207  3.7 60.95
    10:                      9 204  3.7 64.65
    11:                     16 199  3.6 68.30
    12:                     17 201  3.6 71.90
    13:                     14 174  3.1 75.25
    14:                     22 159  2.9 78.25
    15:                      6 121  2.2 80.80
    16:                     21 106  1.9 82.85
    17:                      2 101  1.8 84.70
    18:                     26  95  1.7 86.45
    19:                     11  89  1.6 88.10
    20:                     24  84  1.5 89.65
    21:                     32  71  1.3 91.05
    22:                     13  65  1.2 92.30
    23:                     38  50  0.9 93.35
    24:                     25  41  0.7 94.15
    25:                     36  36  0.7 94.85
    26:                     20  39  0.7 95.55
    27:                     28  33  0.6 96.20
    28:                     23  30  0.5 96.75
    29:                     31  24  0.4 97.20
    30:                     15  21  0.4 97.60
    31:                     34  22  0.4 98.00
    32:                     30  14  0.3 98.35
    33:                     33  19  0.3 98.65
    34:                     40  10  0.2 98.90
    35:                     29  11  0.2 99.10
    36:                     37   9  0.2 99.30
    37:                     19   8  0.1 99.45
    38:                     27   6  0.1 99.55
    39:                     39   6  0.1 99.65
    40:                     35   3  0.1 99.75

N是特定簇的总数,P是比例,p是P的累积和。

创建饼图的ggplot2线如下;

ggplot(pietable, aes("", P)) + 
  geom_bar(
    stat = "identity", 
    aes(
      fill = rev(fct_inorder(cluster)))) +
  geom_label_repel(
    data = pietable[!P<1], 
    aes(
      label = paste0(P, "%"),
      y = p1,
      #col = rev(fct_inorder(cluster))
    ),
    point.padding = NA,
    max.overlaps = Inf,
    nudge_x = 1,
    color="red",
    force = 0.5,
    force_pull = 0,
    segment.alpha=0.5,
    arrow=arrow(length = unit(0.05, "inches"),ends = "last", type = "open"),
    show.legend = F
  )+  
  geom_label_repel(
    data = pietable[!P<1], 
      aes(label = cluster,
      y = p1),
      size=2,  
      col="black",
      force = 0,
      force_pull = 0,
      label.size = 0.01,
      show.legend = F
    )+
  scale_fill_manual(values = P40) + 
  coord_polar(theta = "y")+
  theme_void()

这会生成这样的饼图;

由于明显的原因,某些值极小的饼图切片未标记。

我想做的是通过将它们移向饼图的圆周来重新定位切片标签(数量)。

我想要创建的饼图示例如下所示;

对于完成此任务的任何建议,我将不胜感激。

这是一个可视化的很多标签,您可能需要考虑不同的设计。

也就是说,你可以在相关geom中添加nudge_x = 0.33segment.color = 'transparent'来调整标签的位置。请注意,为了使红色箭头与微调的黑色标签对齐,您必须将 aes(after_stat(1.33)) 添加到红色 geom,以匹配黑色 geom (+1.0) 的新 nudge_x 参数。这些行在下面的代码中用 # added 注释标记。

我对你的绘图代码做了一些轻微的修改(你的工作区中似乎有一些变量在你的 post 中不可用),但这是一般的想法:

ggplot(pietable, aes("", P)) + 
  geom_bar(
    stat = "identity", 
    aes(
      fill = factor(cluster))) +
  geom_label_repel(
    data = pietable[!pietable$P<1, ], 
    aes(
      label = paste0(P, "%"),
      y = p,
      x = after_stat(1.33) # added
      #col = rev(fct_inorder(cluster))
    ),
    point.padding = NA,
    max.overlaps = Inf,
    nudge_x = 1,
    color="red",
    force = 0.5,
    force_pull = 0,
    segment.alpha=0.5,
    arrow=arrow(length = unit(0.05, "inches"),ends = "last", type = "open"),
    show.legend = F
  )+  
  geom_label_repel(
    data = pietable[!pietable$P<1,], 
    aes(label = cluster,
        y = p),
    size=2,  
    col="black",
    nudge_x = 0.33, # added
    force = 0,
    force_pull = 0,
    label.size = 0.01,
    show.legend = F,
    segment.color = 'transparent' # added
  )+
  coord_polar(theta = "y")+
  theme_void()

作为参考,我使用的数据集是:

pietable <- structure(list(cluster = c(1, 3, 10, 12, 8, 5, 7, 18, 4, 9, 16, 
17, 14, 22, 6, 21, 2, 26, 11, 24, 32, 13, 38, 25, 36, 20, 28, 
23, 31, 15, 34, 30, 33, 40, 29, 37, 19, 27, 39, 35), N = c(962, 
611, 343, 306, 290, 288, 259, 210, 207, 204, 199, 201, 174, 159, 
121, 106, 101, 95, 89, 84, 71, 65, 50, 41, 36, 39, 33, 30, 24, 
21, 22, 14, 19, 10, 11, 9, 8, 6, 6, 3), P = c(17.4, 11.1, 6.2, 
5.5, 5.2, 5.2, 4.7, 3.8, 3.7, 3.7, 3.6, 3.6, 3.1, 2.9, 2.2, 1.9, 
1.8, 1.7, 1.6, 1.5, 1.3, 1.2, 0.9, 0.7, 0.7, 0.7, 0.6, 0.5, 0.4, 
0.4, 0.4, 0.3, 0.3, 0.2, 0.2, 0.2, 0.1, 0.1, 0.1, 0.1), p = c(8.7, 
22.95, 31.6, 37.45, 42.8, 48, 52.95, 57.2, 60.95, 64.65, 68.3, 
71.9, 75.25, 78.25, 80.8, 82.85, 84.7, 86.45, 88.1, 89.65, 91.05, 
92.3, 93.35, 94.15, 94.85, 95.55, 96.2, 96.75, 97.2, 97.6, 98, 
98.35, 98.65, 98.9, 99.1, 99.3, 99.45, 99.55, 99.65, 99.75)), row.names = c(NA, 
-40L), class = c("tbl_df", "tbl", "data.frame"))