ggplot2 饼图与 geom_text_repel

sar*_*rgg 7 r ggplot2 pie-chart ggrepel

我正在用 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)
Run Code Online (Sandbox Code Playgroud)

然后我想利用 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)
Run Code Online (Sandbox Code Playgroud)

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

并弄乱了标签。

任何人都知道如何将标签的正确定位与 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    
Run Code Online (Sandbox Code Playgroud)

And*_*din 9

首先,您需要在coord_polar(). 我会用 'dplyr' 来做,但你可以使用任何你喜欢的东西:

library('dplyr')

df <- df %>% 
  arrange(treatment, desc(annotation)) %>% 
  group_by(treatment) %>% 
  mutate(text_y = cumsum(value) - value/2)

df
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

现在文本和标签将位于列的中间,当我们将text_yy用作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)
Run Code Online (Sandbox Code Playgroud)

条形图

现在添加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")
Run Code Online (Sandbox Code Playgroud)

Polar_pie