PieDonut不显示某些饼图标签

时间:2020-03-11 18:32:18

标签: r plot pie-chart sunburst-diagram

我已使用以下数据从下图绘制圆形图,并且无法显示最窄部分的标签。有什么线索吗? 我尝试减小标签的大小,但不起作用。

数据

      level1    level2             size
      Interface     A1           191730
      Interface     A2           524340
      Interface  minor          2529189
      Interface     P1          1273072
      Interface     P2           126295
      Interface     P3           279050
      Interface     P4            74326
      Interface     P5            16646
   No structure     A1 654914.333333333
  No structure     A2 4965368.33333333
  No structure  minor 13654304.3333333
  No structure     P1 6627555.33333333
  No structure     P2          1131774
  No structure     P3          2011299
  No structure     P4           485273
  No structure     P5           116248
 Non-interface     A1           317491
 Non-interface     A2           978807
 Non-interface  minor          3689632
 Non-interface     P1          1690987
 Non-interface     P2           192730
 Non-interface     P3           468848
 Non-interface     P4           125529
 Non-interface     P5            21676

代码:

#create PieDonut
require(ggplot2)
require(moonBook)
require(webr)
PieDonut(data,
         aes(pies= level2, donuts = level1, count = size),
         ratioByGroup=T,
         addDonutLabel = F,
         labelpositionThreshold = 0.4,
         donutLabelSize = 3,
         use.labels = F,
         title="Title",
         maxx = 1.5,
         r0=0,showPieName=FALSE)

结果:

注意:作为一种解决方法,我使用了森伯斯特包装。但是我认为它看起来很混乱,这就是为什么我要使用其他图。不过,这是我的代码和剧情。

# install ggsunburst
if (!require("ggplot2")) install.packages("ggplot2")
if (!require("rPython")) install.packages("rPython")
install.packages("http://genome.crg.es/~didac/ggsunburst/ggsunburst_0.0.10.tar.gz", repos=NULL, type="source")
library(ggsunburst)
library(ggrepel)

names(data) = c("parent","node", "size")
data$location <- data$parent
write.table(data, file = 'data.csv', row.names = F, sep = ",")
sb <- sunburst_data('data.csv', type = 'node_parent', sep = ",", node_attributes = c("location","size"))
sb$rects[!sb$rects$leaf,]$location <- sb$rects[!sb$rects$leaf,]$name
colors= c("#2DA86D", "#A72D98", "#423FA9", "#4BC88B", "#5FCE98", "#73D4A5", "#87DAB2", "#9BE0BF", "#AFE6CB", "#C3ECD8", "#D7F2E5",
  "#C74BB7", "#CD5FBF", "#D373C7", "#D987CF", "#E09BD7", "#E6AFDF", "#ECC3E7", "#F2D7EF", "#5F5DC8", "#716FCE", "#8381D4", "#9493DA", "#A6A5E0", "#B8B7E6", "#C9C9EC", "#DBDBF2")

n_total_size = 42115268

p <- ggsunburst::sunburst(sb,
              rects.fill = colors,
              rects.fill.aes=0,
              rects.size =2,
              node_labels.size = 5,
              leaf_labels.size = 3,
              blank = T,
              leaf_labels = T,
              rects.color = "white",
              node_labels = T,
              node_labels.color = "white",
              node_labels.min = 0)+
  geom_label_repel(data = sb$leaf_labels,
                   aes(x=x,
                       y=0,
                       label=paste(round(size/n_total_size * 100, 2), '%')),
              colour = colors[4:27],
              nudge_y = .55, 
              segment.size = 0.7, 
              show.legend = T,
              segment.colour = "black",
              fontface = 'bold')

2 个答案:

答案 0 :(得分:1)

使用ggrepel和ggsunburst的荣誉,但是我同意可以改善结果。

这不是理想的解决方案,但是您可以单独绘制带有较小size的标签。 您可以根据sb$leaf_labels拆分size,并手动设置new_y

library(ggsunburst)

data <- read.table(header = T, text = "
level1    level2             size
Interface     A1           191730
Interface     A2           524340
Interface  minor          2529189
Interface     P1          1273072
Interface     P2           126295
Interface     P3           279050
Interface     P4            74326
Interface     P5            16646
No-structure     A1 654914.333333333
No-structure     A2 4965368.33333333
No-structure  minor 13654304.3333333
No-structure     P1 6627555.33333333
No-structure     P2          1131774
No-structure     P3          2011299
No-structure     P4           485273
No-structure     P5           116248
Non-interface     A1           317491
Non-interface     A2           978807
Non-interface  minor          3689632
Non-interface     P1          1690987
Non-interface     P2           192730
Non-interface     P3           468848
Non-interface     P4           125529
Non-interface     P5            21676")

names(data) = c("parent","node", "size")
data$location <- data$parent
write.table(data, file = 'data.csv', row.names = F, sep = ",")
sb <- sunburst_data('data.csv', type = 'node_parent', sep = ",", node_attributes = c("location","size"))
sb$rects[!sb$rects$leaf,]$location <- sb$rects[!sb$rects$leaf,]$name
colors= c("#2DA86D", "#A72D98", "#423FA9", "#4BC88B", "#5FCE98", "#73D4A5", "#87DAB2", "#9BE0BF", "#AFE6CB", "#C3ECD8", "#D7F2E5",
          "#C74BB7", "#CD5FBF", "#D373C7", "#D987CF", "#E09BD7", "#E6AFDF", "#ECC3E7", "#F2D7EF", "#5F5DC8", "#716FCE", "#8381D4", "#9493DA", "#A6A5E0", "#B8B7E6", "#C9C9EC", "#DBDBF2")

n_total_size = 42115268

sb$leaf_labels <- within(sb$leaf_labels,{
  percentage = paste("(",round(size/n_total_size * 100, 2),"%)",sep = "")
  new_label = paste(label,percentage, sep = " ")
  })

text_size <- 3
wide <- subset(sb$leaf_labels, size > 191730.0)
narrow <- subset(sb$leaf_labels, size <= 191730.0)
narrow$new_y <- c(1, 1.25, 1, .75, 1, 1, 1.25)

ggsunburst::sunburst(sb,
                          rects.fill = colors,
                          rects.fill.aes=0,
                          rects.size =0,
                          node_labels.size = 5,
                          leaf_labels.size = 3,
                          blank = T,
                          leaf_labels = F,
                          rects.color = "white",
                          node_labels = T,
                          node_labels.color = "white",
                          node_labels.min = 0
                          ) + 

  geom_segment(data = wide, aes(x=x, xend=x, y=y_out, yend=.1), size = .5) +
  geom_segment(data = narrow, aes(x=x, xend=x, y=y_out, yend=new_y), size = .5) +
  geom_text(data = wide, aes(x=x, y=.15, label=new_label, angle=angle, hjust=hjust), size = text_size) +
  geom_text(data = narrow, aes(x=x, y=new_y, label=new_label, angle=0, hjust=hjust), size = text_size) 

enter image description here

答案 1 :(得分:1)

纯属运气发现

显式设置 PieDonut 参数 showRatioThreshold = F 对我有用

相关问题