在R中使用ggplot2制作多个不同大小的饼图散点图。

3

我有一个数据框,其中包含以下数据:

> data_graph
# A tibble: 12 x 4
# Groups:   ATTPRO, ATTMAR [?]
       x     y group    nb
   <dbl> <dbl> <chr> <int>
 1     0     0     1  1060
 2     0     0     2   361
 3     0     0     3   267
 4     0     1     1   788
 5     0     1     2   215
 6     0     1     3    80
 7     1     0     1   485
 8     1     0     2   168
 9     1     0     3   101
10     1     1     1  6306
11     1     1     2  1501
12     1     1     3   379

我的目标是有以下图表:

  • 将定性变量xy放在X/Y轴上
  • nb表示饼图大小的定量变量
  • group表示饼图部分的定性变量

使用ggplot2包最接近这个目标的结果只能给我气泡图,使用以下代码。我找不到在其中放置饼图的解决方案:

library(ggplot2)
  ggplot(data_graph, aes(y = factor(y),x = factor(x))) +
  geom_point(aes(colour = group, size = nb)) +
  theme_bw() + 
  cale_size(range = c(1, 20)) +
  labs(x = "x", y = "y", color = "group", size = "nb")

在此输入图片描述

使用scatterpie包并没有太大帮助。这次饼图画得很好,但我找不到一种方法来使用nb定义饼图大小。此外,xy被视为定量变量(我尝试了factor()没有任何机会),而不是定性变量。结果非常丑陋,没有完整的图例。

> tmp
  x y    A    B   C
1 0 0 1060  361 267
2 0 1  788  215  80
3 1 0  485  168 101
4 1 1 6306 1501 379

library(scatterpie)
ggplot() +
   geom_scatterpie(aes(x = x, y = y), data = tmp, cols = c("A", "B", "C")) +
   coord_fixed()

在此输入图片描述

如何修改这段代码,让第一个图表的样式和第二个的饼状图一致呢?


请尽量少使用图片,特别是在问题中加入使用的数据样本,以提高获得答案的可能性。 - Heikki
@Heikki 感谢您的建议。我已经修复了数据框代码。 - MarieT
1
通常,我们希望将数据粘贴为 dput() 的输出,这样我们就可以将其直接复制到代码中并直接重新创建数据框。 - Claus Wilke
1个回答

9
这似乎是使用ggforce的geom_arc_bar()进行处理,并结合一些dplyr技巧。这将把xy视为连续变量,但这不是问题,您可以通过设置正确的轴设置来假装它们是离散的。
数据如下:
data_graph <- read.table(text = "x     y group    nb
1     0     0     1  1060
2     0     0     2   361
3     0     0     3   267
4     0     1     1   788
5     0     1     2   215
6     0     1     3    80
7     1     0     1   485
8     1     0     2   168
9     1     0     3   101
10     1     1     1  6306
11     1     1     2  1501
12     1     1     3   379", header = TRUE)

代码如下:
library(ggforce)
library(dplyr)

# make group a factor
data_graph$group <- factor(data_graph$group)

# add case variable that separates the four pies
data_graph <- cbind(data_graph, case = rep(c("Aaaa", "Bbbb", "Cccc", "Dddd"), each = 3))

# calculate the start and end angles for each pie
data_graph <- left_join(data_graph,
  data_graph %>% 
    group_by(case) %>%
    summarize(nb_total = sum(nb))) %>%
  group_by(case) %>%
  mutate(nb_frac = 2*pi*cumsum(nb)/nb_total,
         start = lag(nb_frac, default = 0))

# position of the labels
data_labels <- data_graph %>% 
  group_by(case) %>%
  summarize(x = x[1], y = y[1], nb_total = nb_total[1])

# overall scaling for pie size
scale = .5/sqrt(max(data_graph$nb_total))

# draw the pies
ggplot(data_graph) + 
  geom_arc_bar(aes(x0 = x, y0 = y, r0 = 0, r = sqrt(nb_total)*scale,
                   start = start, end = nb_frac, fill = group)) +
  geom_text(data = data_labels,
            aes(label = case, x = x, y = y + scale*sqrt(nb_total) + .05),
            size =11/.pt, vjust = 0) +
  coord_fixed() +
  scale_x_continuous(breaks = c(0, 1), labels = c("X0", "X1"), name = "x axis") +
  scale_y_continuous(breaks = c(0, 1), labels = c("Y0", "Y1"), name = "y axis") +
  theme_minimal() +
  theme(panel.grid.minor = element_blank())

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接