【问题标题】:ggplot2 pie plot with geom_text_repelggplot2 饼图与 geom_text_repel
【发布时间】:2017-09-18 11:10:13
【问题描述】:

我正在使用 ggplot2 绘制多个饼图,并成功地将标签绘制在正确的位置,如下所示:

df <- data.frame(annotation=rep(c("promoter", "intergenic", "intragene", "5prime", "3prime"), 3), value=c(69.5, 16, 10.7, 2.5, 1.3, 57.2, 18.8, 20.2, 2.1, 1.7, 50.2, 32.2, 15.3, 1.2, 1.1), treatment=rep(c("treated1", "treated2", "untreated"), c(5, 5, 5)))

library(ggplot2)

ggplot(data = df, aes(x = "", y = value, fill = annotation)) + 
geom_bar(stat = "identity") +
geom_text(aes(label = value), position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
facet_grid(.~treatment)

然后我想利用 ggrepel 使小切片数字不重叠:

library(ggrepel)

ggplot(data = df, aes(x = "", y = value, fill = annotation)) + 
geom_bar(stat = "identity") +
geom_text_repel(aes(label = value), position = position_stack(vjust = 0.5)) +  
coord_polar(theta = "y") +
facet_grid(.~treatment)

但我收到以下警告 "警告:忽略未知参数:位置"

并且弄乱了标签。

任何人都知道如何将标签的正确定位与 geom_text_repel 或任何替代方法结合起来?

谢谢!

sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Scientific Linux 7.2 (Nitrogen)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
 [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggrepel_0.6.5 ggplot2_2.2.1 limma_3.26.9 

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.8      digest_0.6.12    grid_3.3.2       plyr_1.8.4      
 [5] gtable_0.2.0     magrittr_1.5     scales_0.4.1     stringi_1.1.5   
 [9] reshape2_1.4.2   lazyeval_0.2.0   labeling_0.3     tools_3.3.2     
 [13] stringr_1.2.0    munsell_0.4.3    colorspace_1.3-2 tibble_1.3.0    

【问题讨论】:

    标签: r ggplot2 pie-chart ggrepel


    【解决方案1】:

    首先,您需要在coord_polar() 之前创建一个包含标签位置的正确列。我会用“dplyr”来做,但你可以使用任何你喜欢的东西:

    library('dplyr')
    
    df <- df %>% 
      arrange(treatment, desc(annotation)) %>% 
      group_by(treatment) %>% 
      mutate(text_y = cumsum(value) - value/2)
    
    df
    
    # A tibble: 15 x 4
    # Groups:   treatment [3]
       annotation value treatment text_y
            <chr> <dbl>     <chr>  <dbl>
     1   promoter  69.5  treated1  34.75
     2  intragene  10.7  treated1  74.85
     3 intergenic  16.0  treated1  88.20
     4     5prime   2.5  treated1  97.45
     5     3prime   1.3  treated1  99.35
     6   promoter  57.2  treated2  28.60
     7  intragene  20.2  treated2  67.30
     8 intergenic  18.8  treated2  86.80
     9     5prime   2.1  treated2  97.25
    10     3prime   1.7  treated2  99.15
    11   promoter  50.2 untreated  25.10
    12  intragene  15.3 untreated  57.85
    13 intergenic  32.2 untreated  81.60
    14     5prime   1.2 untreated  98.30
    15     3prime   1.1 untreated  99.45
    

    现在,当我们将text_y 用作y 美学geom_text() 时,文本和标签将位于列的中间。

    coord_polar()之前的绘图:

    ggplot(data = df, aes(x = "", y = value, fill = annotation)) + 
      geom_bar(stat = "identity") +
      geom_label(aes(label = value, y = text_y)) +
      facet_grid(.~treatment)
    

    现在添加label_repel 并转换坐标:

    ggplot(data = df, aes(x = "", y = value, fill = annotation)) +
      geom_bar(stat = "identity") +
      geom_label_repel(aes(label = value, y = text_y)) +
      facet_grid(. ~ treatment) +
      coord_polar(theta = "y")
    

    【讨论】:

    • 谢谢!它工作得很好。我对某事感到好奇:我可以强制 geom_label_repel 将标签写在饼图本身之外,以保持它更干净吗?
    • @sargg 您可以使用geom_label_repel(aes(label = value, y = text_y), nudge_x = 1.6) 或使用其他值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2018-04-24
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多