问题描述
我想按组对数据进行排序,然后对每个组按不同的顺序(升序、无、降序)排序,但似乎 ggpubr
的 sort.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
)
解决方法
这是第一个数据操作的另一种方式:
- 第一列的行名
rownames_to_column
-
cyl
分解 - 在使用
sort
语句将组内的ifelse
分组后 - 和重要的
arrange
bycyl
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
)
,
我不知道是否可以在 ggbarplot
的 ggpubr
函数内完成,但这是一种操纵因子水平的方法。
我们创建了一个数据框 (order_data
),它具有我们希望为每个组对数据进行排序的顺序。在这里,我使用约定 1 作为升序,0 作为无序,-1 作为降序。
library(dplyr)
library(ggpubr)
order_data <- data.frame(cyl = factor(c(4,6,8)),order = c(1,-1))
order_data
# cyl order
#1 4 1
#2 6 0
#3 8 -1
将 order
值与 mpg
和 arrange
数据相乘,根据它们的出现和绘图将名称值转换为因子。
dfm %>%
left_join(order_data,by = 'cyl') %>%
arrange(cyl,mpg * order) %>%
mutate(name = factor(name,name)) %>%
ggbarplot(x = "name",# jco journal color palett.
x.text.angle = 90 # Rotate vertically x axis texts
)