ggpubr:按组排序但排序顺序不同(asc,desc)
ggpubr: sort by group but with different sorting order (asc, desc)
我想按组对数据进行排序,然后对每个组按不同的顺序(升序、none、降序)排序,但似乎 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
)
我不知道是否可以在 ggpubr
的 ggbarplot
函数内完成,但这是一种通过操纵因子水平的方法。
我们创建了一个数据框 (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
值与mpg
和arrange
数据相乘,根据它们的出现和绘图将名称值作为因子。
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
)
这是第一次数据操作的另一种方式:
- 第一列的行名
rownames_to_column
cyl
因数
- 在使用
ifelse
语句 sort
分组后
- 重要
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
)
我想按组对数据进行排序,然后对每个组按不同的顺序(升序、none、降序)排序,但似乎 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
)
我不知道是否可以在 ggpubr
的 ggbarplot
函数内完成,但这是一种通过操纵因子水平的方法。
我们创建了一个数据框 (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
值与mpg
和arrange
数据相乘,根据它们的出现和绘图将名称值作为因子。
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
)
这是第一次数据操作的另一种方式:
- 第一列的行名
rownames_to_column
cyl
因数- 在使用
ifelse
语句sort
分组后 - 重要
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
)