棒棒糖图,在组内排序

问题描述 投票:3回答:1

我正在尝试使用看起来像这样的数据集创建棒棒糖图:

set.seed(123)
example_df <- data.frame(strategy = as.factor(rep(LETTERS[1:5], each = 2)), 
                         mt_equip = as.factor(rep(c('r', 'v'), times = 5)), 
                         cc = as.factor(c('cc', 'cc', 'no_cc', 'no_cc', 'part_cc', 'part_cc', 'cc', 'cc', 'no_cc', 'no_cc')), 
                         vt = as.factor(c(rep('d10', 4), rep('d1+d10', 2), rep('d1', 4))), 
                         model_ouput = rnorm(10)
                         )
example_df
   strategy mt_equip      cc     vt model_ouput
1         A        r      cc    d10 -0.56047565
2         A        v      cc    d10 -0.23017749
3         B        r   no_cc    d10  1.55870831
4         B        v   no_cc    d10  0.07050839
5         C        r part_cc d1+d10  0.12928774
6         C        v part_cc d1+d10  1.71506499
7         D        r      cc     d1  0.46091621
8         D        v      cc     d1 -1.26506123
9         E        r   no_cc     d1 -0.68685285
10        E        v   no_cc     d1 -0.44566197

我的目标是制作棒棒糖,以便:

  1. 它们以cc分组和着色,mt_equip作为shape规格。
  2. 在每个cc类别中,棒棒糖从最低到最高排序。
  3. 棒棒糖应分开放置,而不要如图所示那样纠结。

我尝试从geom_lollipop()包中选择ggalt选项,如下所示:

library(ggalt)

option2 <- ggplot(data = example_df, 
       aes(x = reorder(cc, model_ouput))) + 
    geom_lollipop(aes(y = model_ouput,
                   shape = mt_equip,
                   color = cc),
                  size = 5) +
    scale_shape_manual(values = c(21, 24)) 
plot(option2)

这就是我得到的:

enter image description here

我如何:

  1. 解开棒棒糖,以便每个人在cc组中单独站立?
  2. 将(1)中散乱的棒棒糖从最低到最高排序?我尝试了reorder,但没有产生如图所示的设计效果。
  3. 使条形空心以进行颜色和描边的后期处理吗?

谢谢您的帮助。

r ggplot2
1个回答
0
投票

根据@GregorThomas的一些提示,我终于使用以下代码解决了这个问题:

library(ggalt)
library(dplyr)
library(tidyr)

set.seed(123)
example_df <- data.frame(strategy = as.factor(rep(LETTERS[1:5], each = 2)), 
                         mt_equip = as.factor(rep(c('r', 'v'), times = 5)), 
                         cc = as.factor(c('cc', 'cc', 'no_cc', 'no_cc', 'part_cc', 'part_cc', 'cc', 'cc', 'no_cc', 'no_cc')), 
                         vt = as.factor(c(rep('d10', 4), rep('d1+d10', 2), rep('d1', 4))), 
                         model_ouput = rnorm(10)
)



#the strategy variable is not unique so we make it so but combining two cols
example_df_mod <- example_df %>%
    unite(col = 'strategy', c(strategy, mt_equip), remove = F)

#make lollipop plot grouped by cc and sorted within each group 
option2 <- example_df_mod %>% 
    group_by(cc) %>% 
    arrange(model_ouput, .by_group = T) %>% 
    ggplot(aes(group = cc)) + 
    geom_lollipop(aes(x = order(cc, model_ouput), 
                      y = model_ouput,
                      shape = mt_equip,
                      color = cc),
                  size = 5) 
plot(option2)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.