2017-12-02 272 views
1

我有包含以下数据的数据帧:制作不同尺寸的多个饼图的散点图,使用GGPLOT2中的R

> 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 

我的目标是具有以下图表:

  • 两个Xÿ,定性变量,被投入作为X/Y轴
  • NB,quantita略去变量,代表馅饼大小
  • ,定性变量,代表馅饼份

最好结果approching此使用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") 

enter image description here

使用scatterpie包没有帮助那么多。这次馅饼画得很好,但我找不到一种方法来使用nb来定义饼图大小。另外,xy被视为定量变量(我尝试因子()没有任何机会),而不是定性变量。结果很丑,没有完整的图例。

> 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() 

enter image description here

如何验证码才能有第二人的馅饼第一图表改变?

+0

请使用更少的图像,尤其是添加使用的数据样本作为问题的一部分,如果你想增加获得答案的概率。 – Heikki

+0

@ Heikki感谢您的提示。我修复了数据帧代码。 – MarieT

+1

通常,我们希望将数据粘贴为'dput()'的输出,所以我们可以将它复制到我们的代码中并直接重新创建数据框。 –

回答

5

这似乎是来自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