问题
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