PieDonut не отображает некоторые метки p ie - PullRequest
4 голосов
/ 11 марта 2020

Я использовал следующие данные для построения кругового графика на рисунке ниже, и я не могу отобразить метки самых узких сечений. Любая подсказка, почему? Я пытался уменьшить размер метки и не работает.

data

      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')

1 Ответ

1 голос
/ 14 марта 2020

спасибо за использование 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

...