ggplot2 pie plot with geom_text_repel

余生长醉 提交于 2020-01-01 10:48:12

问题


I am plotting multiple pie plots with ggplot2 and succeeded in having the labels plotted in the right positions, as:

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)

I then wanted to make use of ggrepel so that the small slices numbers do not overlap:

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)

But I get the following warning "Warning: Ignoring unknown parameters: position"

and messed up labels.

Anyone knows how to combine the right positioning of the labels with geom_text_repel, or any alternative?

Thank you!

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    

回答1:


First, you need to make a correct column with position of your labels before coord_polar(). I would do it with 'dplyr' but you can use whatever you comfortable with:

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

Now text and labels will be in the middle of a column when we will use text_y as a y aesthetic for geom_text().

Plot prior to 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)

And now adding label_repel and transforming coordinates:

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



来源:https://stackoverflow.com/questions/46277894/ggplot2-pie-plot-with-geom-text-repel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!