r - 在组内排序的 Lollipop 图

标签 r ggplot2

我正在尝试使用如下所示的数据集创建 Lollipop 图:

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

我的目标是制作一个 Lollipop 图以便:

  1. 它们按 cc 分组和着色,以 mt_equip 作为 shape 规范。
  2. 在每个 cc 类别中, Lollipop 从最低到最高排序。
  3. Lollipop 应该分开,不要像图中那样缠在一起。

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

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. 解开 Lollipop ,使每个 Lollipop 都独立于 cc 组中?
  2. 将 (1) 中解开的 Lollipop 从低到高排序?我试过 reorder 但没有产生如图所示的设计效果。
  3. 将条形图制作成空心的,以便进行颜色和描边的后期处理?

感谢您的帮助。

最佳答案

根据@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

关于r - 在组内排序的 Lollipop 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61602311/

相关文章:

r - 表中出现错误的条形图

r - 将自定义颜色渐变映射到 POSIXct 值

r - sf LINESTRING 的颜色部分(按变量)

r - 如何将间隙插入时间序列中,以使结果时间序列中没有间隙?

r - 在 R 中使用 tidyjson 从嵌套 json 文档中提取数据

r - 在 R 中,是否有一种简单的方法可以将两个数据框列转换为具有分组因子的公式?

r - 查找包中的所有函数(包括私有(private)函数)

r - 绘制二次增长的增长曲线

r - 在 R 中绘制时间序列(24 小时)

R ggplot : suppress bottom of error bar on geom_bar