Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot2 pie plot with geom_text_repel

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    
like image 389
sargg Avatar asked Sep 18 '17 11:09

sargg


1 Answers

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)

Bar plot

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

Polar_pie

like image 142
Andrey Kolyadin Avatar answered Oct 06 '22 04:10

Andrey Kolyadin