ggpubr:按组排序但排序顺序不同(asc,desc)

ggpubr: sort by group but with different sorting order (asc, desc)

我想按组对数据进行排序,然后对每个组按不同的顺序(升序、none、降序)排序,但似乎 ggpubrsort.val 参数只取长度为 1 的值。我想知道我可以采取什么替代方法来使输出达到预期的结果而无需大量修改?

我将使用 mtcars 数据作为示例。数据按cyl组(3组)排序,按asc顺序渲染,是否可以给三组分配不同的排序顺序?例如,“asc”、“none”、“desc”? (我试过 c("asc", "none", "desc"),但没用)。

下面是我的最小工作示例。

# Require the package
library(ggpubr)


data("mtcars")
dfm <- mtcars
# Convert the cyl variable to a factor
dfm$cyl <- as.factor(dfm$cyl)
# Add the name colums
dfm$name <- rownames(dfm)
# Inspect the data
head(dfm[, c("name", "wt", "mpg", "cyl")])

# Sort by group and by ascending order

ggbarplot(dfm, x = "name", y = "mpg",
          fill = "cyl",       # change fill color by cyl
         color = "white", # Set bar border colors to white
          palette = "jco",  # jco journal color palett. 
          sort.val = "asc",  # Sort the value in dscending order 
          sort.by.groups = TRUE, # Sort inside each group
          x.text.angle = 90 # Rotate vertically x axis texts
          )

我不知道是否可以在 ggpubrggbarplot 函数内完成,但这是一种通过操纵因子水平的方法。

我们创建了一个数据框 (order_data),它具有我们希望为每个组对数据进行排序的顺序。在这里,我使用惯例 1 为升序,0 为无序,-1 为降序。

library(dplyr)
library(ggpubr)

order_data <- data.frame(cyl = factor(c(4, 6, 8)), order = c(1, 0, -1))
order_data

#  cyl order
#1   4     1
#2   6     0
#3   8    -1

order值与mpgarrange数据相乘,根据它们的出现和绘图将名称值作为因子。

dfm %>%
  left_join(order_data, by = 'cyl') %>%
  arrange(cyl, mpg * order) %>%
  mutate(name = factor(name, name)) %>%
  ggbarplot(x = "name", y = "mpg",
          fill = "cyl",       # change fill color by cyl
          color = "white", # Set bar border colors to white
          palette = "jco",  # jco journal color palett. 
          x.text.angle = 90 # Rotate vertically x axis texts
)

这是第一次数据操作的另一种方式:

  1. 第一列的行名 rownames_to_column
  2. cyl 因数
  3. 在使用 ifelse 语句 sort 分组后
  4. 重要 arrange cyl
library(tidyverse)
library(ggpubr)

dfm <- mtcars %>% 
    rownames_to_column("name") %>% 
    mutate(cyl = as_factor(cyl)) %>% 
    group_by(cyl) %>% 
    mutate(mpg=ifelse(cyl==4, sort(mpg), mpg),
           mpg=ifelse(cyl==8, sort(mpg, decreasing = TRUE), mpg)
    ) %>% 
    arrange(cyl)

# plot
ggbarplot(dfm, x = "name", y = "mpg",
          fill = "cyl",       # change fill color by cyl
          color = "white", # Set bar border colors to white
          palette = "jco",  # jco journal color palett.  
          x.text.angle = 90 # Rotate vertically x axis texts
)