R::ggplot2::geom_points: 如何与饼图交换点数?
R::ggplot2::geom_points: how to swap points with pie charts?
我想绘制二维饼图,以显示每个点的组合 "groups."
到目前为止,我正在使用标签排斥来标记最高分,但效果仍然不是很好。我环顾四周,没有看到我要找的东西。
ggplot(data=aggtmp2,aes(x=cluster,y=x,color=groups,shape=dataset)) +
geom_jitter() + facet_grid(datasubset~.) +
geom_text_repel(data=aggtmp2[aggtmp2$xnorm>.925,],aes(label=groups),size=2)
> str(aggtmp2)
'data.frame': 562 obs. of 7 variables:
$ group_name: chr "1_1_D1NF_lewisnegative" "1_1_D1NF_lewisnegative" "1_1_D1NF_lewisnegative" "1_1_D1NF_lewisnegative" ...
$ cluster : Factor w/ 39 levels "10of10","1of1",..: 30 24 11 18 25 18 30 11 25 24 ...
$ x : num 0.591 0.591 0.591 0.591 0.591 ...
$ xnorm : num 0.921 0.921 0.921 0.921 0.921 ...
$ groups : Factor w/ 43 levels "1_1","1_2","1_3",..: 1 1 1 1 1 2 2 2 2 2 ...
$ dataset : Factor w/ 2 levels "D1NF","D2NF": 1 1 1 1 1 1 1 1 1 1 ...
$ datasubset: Factor w/ 5 levels "all","lewisnegative",..: 2 2 2 2 2 2 2 2 2 2 ...
这个答案很接近:ggplot use small pie charts as points with geom_point
但是我试图在没有 facet_grid() 的情况下完成这项工作。这样我就可以更自然地在我设置的 xy 坐标 space 中显示构图。
更新:
如果您特别想要饼图,最好使用软件包 scatterpie
、https://cran.r-project.org/web/packages/scatterpie/vignettes/scatterpie.html。不过,我下面的方法也适用于非饼图。
我很想知道它是否可以完成,我不确定这个解决方案有多灵活,但这是我想出的。值得逐行逐步执行此代码块,在每个 %>%
管道之前停下来查看它在运行过程中生成的内容。第一个块生成一些数据:5 个随机 X 和 Y 值。然后生成组件标签及其值并将其绑定到 X 和 Y。然后为了概念验证,我创建了一个额外的列,显示每个 X-Y 对的组件总和。
require(dplyr)
require(ggplot2)
df <- data_frame(x1 = rnorm(5), y1 = rnorm(5)) %>%
group_by(x1, y1) %>%
do(data_frame(component = LETTERS[1:3], value = runif(3))) %>%
mutate(total = sum(value)) %>%
group_by(x1, y1, total)
df
Source: local data frame [15 x 5] Groups: x1, y1, total [5]
x1 y1 component value total
<dbl> <dbl> <chr> <dbl> <dbl>
1 -1.0933810 0.4162150 A 0.920992065 2.1406433
2 -1.0933810 0.4162150 B 0.914163390 2.1406433
3 -1.0933810 0.4162150 C 0.305487891 2.1406433
4 -0.9579912 1.4080922 A 0.006967777 0.3149009
5 -0.9579912 1.4080922 B 0.128341286 0.3149009
6 -0.9579912 1.4080922 C 0.179591852 0.3149009
7 0.5617438 -0.8770998 A 0.233895761 1.2324975
8 0.5617438 -0.8770998 B 0.942843309 1.2324975
9 0.5617438 -0.8770998 C 0.055758395 1.2324975
10 0.9970852 -0.4142704 A 0.035965092 1.4261429
11 0.9970852 -0.4142704 B 0.454193773 1.4261429
12 0.9970852 -0.4142704 C 0.935984062 1.4261429
13 1.2253968 0.3557304 A 0.692594728 2.1289173
14 1.2253968 0.3557304 B 0.972569822 2.1289173
15 1.2253968 0.3557304 C 0.463752786 2.1289173
此块采用第一个数据帧,并针对每个唯一的 x1
-y1
-total
组合,在名为 subplots
的列表列中生成一个普通饼图.该列中的每个值都是用于生成图形的 ggplot
元素列表。然后它构建另一列,将每个子图转换为名为 subgrobs
的列中的自定义注释。这些注解是可以丢进大图中的。
df.grobs <- df %>%
do(subplots = ggplot(., aes(1, value, fill = component)) +
geom_col(position = "fill", alpha = 0.75, colour = "white") +
coord_polar(theta = "y") +
theme_void()+ guides(fill = F)) %>%
mutate(subgrobs = list(annotation_custom(ggplotGrob(subplots),
x = x1-total/4, y = y1-total/4,
xmax = x1+total/4, ymax = y1+total/4)))
df.grobs
Source: local data frame [5 x 5]
Groups: <by row>
# A tibble: 5 × 5
x1 y1 total subplots subgrobs
<dbl> <dbl> <dbl> <list> <list>
1 -1.0933810 0.4162150 2.1406433 <S3: gg> <S3: LayerInstance>
2 -0.9579912 1.4080922 0.3149009 <S3: gg> <S3: LayerInstance>
3 0.5617438 -0.8770998 1.2324975 <S3: gg> <S3: LayerInstance>
4 0.9970852 -0.4142704 1.4261429 <S3: gg> <S3: LayerInstance>
5 1.2253968 0.3557304 2.1289173 <S3: gg> <S3: LayerInstance>
此处仅采用 5 个独特的 x1
-y1
-total
组合并将它们绘制为常规 ggplot
,但随后还添加了自定义注释我们制作的,其大小与 total
成正比。然后使用空白 geom_col
s.
从原始数据帧 df
构造一个假图例
df.grobs %>%
{ggplot(data = ., aes(x1, y1)) +
scale_x_continuous(expand = c(0.25, 0)) +
scale_y_continuous(expand = c(0.25, 0)) +
.$subgrobs +
geom_text(aes(label = round(total, 2))) +
geom_col(data = df,
aes(0,0, fill = component),
colour = "white")}
许多用于调整大小和 x
、y
比例的数字常量需要肉眼更改以适合您的数据集。
我想绘制二维饼图,以显示每个点的组合 "groups."
到目前为止,我正在使用标签排斥来标记最高分,但效果仍然不是很好。我环顾四周,没有看到我要找的东西。
ggplot(data=aggtmp2,aes(x=cluster,y=x,color=groups,shape=dataset)) +
geom_jitter() + facet_grid(datasubset~.) +
geom_text_repel(data=aggtmp2[aggtmp2$xnorm>.925,],aes(label=groups),size=2)
> str(aggtmp2)
'data.frame': 562 obs. of 7 variables:
$ group_name: chr "1_1_D1NF_lewisnegative" "1_1_D1NF_lewisnegative" "1_1_D1NF_lewisnegative" "1_1_D1NF_lewisnegative" ...
$ cluster : Factor w/ 39 levels "10of10","1of1",..: 30 24 11 18 25 18 30 11 25 24 ...
$ x : num 0.591 0.591 0.591 0.591 0.591 ...
$ xnorm : num 0.921 0.921 0.921 0.921 0.921 ...
$ groups : Factor w/ 43 levels "1_1","1_2","1_3",..: 1 1 1 1 1 2 2 2 2 2 ...
$ dataset : Factor w/ 2 levels "D1NF","D2NF": 1 1 1 1 1 1 1 1 1 1 ...
$ datasubset: Factor w/ 5 levels "all","lewisnegative",..: 2 2 2 2 2 2 2 2 2 2 ...
这个答案很接近:ggplot use small pie charts as points with geom_point 但是我试图在没有 facet_grid() 的情况下完成这项工作。这样我就可以更自然地在我设置的 xy 坐标 space 中显示构图。
更新:
如果您特别想要饼图,最好使用软件包 scatterpie
、https://cran.r-project.org/web/packages/scatterpie/vignettes/scatterpie.html。不过,我下面的方法也适用于非饼图。
我很想知道它是否可以完成,我不确定这个解决方案有多灵活,但这是我想出的。值得逐行逐步执行此代码块,在每个 %>%
管道之前停下来查看它在运行过程中生成的内容。第一个块生成一些数据:5 个随机 X 和 Y 值。然后生成组件标签及其值并将其绑定到 X 和 Y。然后为了概念验证,我创建了一个额外的列,显示每个 X-Y 对的组件总和。
require(dplyr)
require(ggplot2)
df <- data_frame(x1 = rnorm(5), y1 = rnorm(5)) %>%
group_by(x1, y1) %>%
do(data_frame(component = LETTERS[1:3], value = runif(3))) %>%
mutate(total = sum(value)) %>%
group_by(x1, y1, total)
df
Source: local data frame [15 x 5] Groups: x1, y1, total [5]
x1 y1 component value total
<dbl> <dbl> <chr> <dbl> <dbl>
1 -1.0933810 0.4162150 A 0.920992065 2.1406433
2 -1.0933810 0.4162150 B 0.914163390 2.1406433
3 -1.0933810 0.4162150 C 0.305487891 2.1406433
4 -0.9579912 1.4080922 A 0.006967777 0.3149009
5 -0.9579912 1.4080922 B 0.128341286 0.3149009
6 -0.9579912 1.4080922 C 0.179591852 0.3149009
7 0.5617438 -0.8770998 A 0.233895761 1.2324975
8 0.5617438 -0.8770998 B 0.942843309 1.2324975
9 0.5617438 -0.8770998 C 0.055758395 1.2324975
10 0.9970852 -0.4142704 A 0.035965092 1.4261429
11 0.9970852 -0.4142704 B 0.454193773 1.4261429
12 0.9970852 -0.4142704 C 0.935984062 1.4261429
13 1.2253968 0.3557304 A 0.692594728 2.1289173
14 1.2253968 0.3557304 B 0.972569822 2.1289173
15 1.2253968 0.3557304 C 0.463752786 2.1289173
此块采用第一个数据帧,并针对每个唯一的 x1
-y1
-total
组合,在名为 subplots
的列表列中生成一个普通饼图.该列中的每个值都是用于生成图形的 ggplot
元素列表。然后它构建另一列,将每个子图转换为名为 subgrobs
的列中的自定义注释。这些注解是可以丢进大图中的。
df.grobs <- df %>%
do(subplots = ggplot(., aes(1, value, fill = component)) +
geom_col(position = "fill", alpha = 0.75, colour = "white") +
coord_polar(theta = "y") +
theme_void()+ guides(fill = F)) %>%
mutate(subgrobs = list(annotation_custom(ggplotGrob(subplots),
x = x1-total/4, y = y1-total/4,
xmax = x1+total/4, ymax = y1+total/4)))
df.grobs
Source: local data frame [5 x 5]
Groups: <by row>
# A tibble: 5 × 5
x1 y1 total subplots subgrobs
<dbl> <dbl> <dbl> <list> <list>
1 -1.0933810 0.4162150 2.1406433 <S3: gg> <S3: LayerInstance>
2 -0.9579912 1.4080922 0.3149009 <S3: gg> <S3: LayerInstance>
3 0.5617438 -0.8770998 1.2324975 <S3: gg> <S3: LayerInstance>
4 0.9970852 -0.4142704 1.4261429 <S3: gg> <S3: LayerInstance>
5 1.2253968 0.3557304 2.1289173 <S3: gg> <S3: LayerInstance>
此处仅采用 5 个独特的 x1
-y1
-total
组合并将它们绘制为常规 ggplot
,但随后还添加了自定义注释我们制作的,其大小与 total
成正比。然后使用空白 geom_col
s.
df
构造一个假图例
df.grobs %>%
{ggplot(data = ., aes(x1, y1)) +
scale_x_continuous(expand = c(0.25, 0)) +
scale_y_continuous(expand = c(0.25, 0)) +
.$subgrobs +
geom_text(aes(label = round(total, 2))) +
geom_col(data = df,
aes(0,0, fill = component),
colour = "white")}
许多用于调整大小和 x
、y
比例的数字常量需要肉眼更改以适合您的数据集。