ggplot2 饼图 geom_text_repel
ggplot2 pie plot with geom_text_repel
我正在使用 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)
但我收到以下警告
"Warning: Ignoring unknown parameters: position"
并弄乱了标签。
有谁知道如何将标签的正确定位与 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
首先,您需要在 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
作为 geom_text()
的 y
美学时,文本和标签将位于列的中间。
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")
我正在使用 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)
但我收到以下警告 "Warning: Ignoring unknown parameters: position"
并弄乱了标签。
有谁知道如何将标签的正确定位与 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
首先,您需要在 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
作为 geom_text()
的 y
美学时,文本和标签将位于列的中间。
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")