ggplot2 facet_grid 具有多个重复值的内部元素的不同重新排序
Different reorder in ggplot2's facet_grid inner elements with multiple repeated values
这可能是我一直试图完成的一个非常特殊的案例,但仍然非常有用。我需要根据另一个变量对具有多个重复值的 ggplot2 facet_grid 内部元素进行排序。具有给定 data.frame df
的示例(如下所示)。使用 factor
时,您可以为其级别定义特定顺序,但在这种情况下,有不同的顺序,因为它基于第三个值,在示例中,对于 var2 = TRUE
的网格, A
将是第一个(排名)元素,对于 var2 = FALSE
的网格,A
应该是最后一个。
df <- data.frame(var1 = c(TRUE, TRUE, FALSE, FALSE, FALSE),
var2 = c('C','A','A','Z','C'),
n = c(5,10,1,3,3))
ggplot(df, aes(reorder(var2,n), n)) +
geom_col() + facet_grid(var1~.) + coord_flip()
我希望通过 n
变量对两个网格进行排序,结果应该是 FALSE
网格的 C、Z、A 和 TRUE
的 A、C、Z网格。应该有一个 ungroup()
函数用于 ggplot2
的重新排序...
奖励: 更复杂的是,我在 lares library 中有一个 tidyverse 友好函数用于计算和绘制频率 (freqs
)。它对每个变量使用 !!!variables
延迟评估,有时这些变量可能不止一个。例如,distr(df, var1, var2, var3)
或简单的 distr(df, var1)
。这就是为什么我不能(或者至少我不知道如何)将这些变量动态转换为排序因子(如果这是解决方案)的原因。
有没有一种方法可以在不使用 cowplot
或 gridExtra
的情况下创建不同的图,然后将它们全部粘贴在一起?太慢了...
这是我能解决的问题。
library(ggplot2)
df <- data.frame(var1 = c(TRUE, TRUE, FALSE, FALSE, FALSE),
var2 = as.factor(c('C','A','A','Z','C')),
n = c(5, 10, 1, 3, 3))
df$var3 <- ifelse(df$var1, paste0(df$var2, 'T'), paste0(df$var2, 'F'))
ggplot(df, aes(x = reorder(var3, n),
y = n)) +
geom_col() +
facet_grid(var1 ~ ., scales = "free", space = "free") +
coord_flip()
这对你有用吗?查看更多
library(tidyverse)
df <- data.frame(var1 = c(TRUE, TRUE, FALSE, FALSE, FALSE),
var2 = c('C','A','A','Z','C'),
n = c(5,10,1,3,3))
reorder_within <- function(x, by, within, fun = mean, sep = "___", ...) {
new_x <- paste(x, within, sep = sep)
stats::reorder(new_x, by, FUN = fun)
}
scale_x_reordered <- function(..., sep = "___") {
reg <- paste0(sep, ".+$")
ggplot2::scale_x_discrete(labels = function(x) gsub(reg, "", x), ...)
}
ggplot(df, aes(reorder_within(var2, n, var1), n)) +
geom_col() +
scale_x_reordered() +
facet_grid(var1 ~ ., scales = "free", space = "free") +
coord_flip() +
theme_minimal() +
theme(panel.grid.major.y = element_blank())
由 reprex package (v0.2.1.9000)
于 2019-03-08 创建
这可能是我一直试图完成的一个非常特殊的案例,但仍然非常有用。我需要根据另一个变量对具有多个重复值的 ggplot2 facet_grid 内部元素进行排序。具有给定 data.frame df
的示例(如下所示)。使用 factor
时,您可以为其级别定义特定顺序,但在这种情况下,有不同的顺序,因为它基于第三个值,在示例中,对于 var2 = TRUE
的网格, A
将是第一个(排名)元素,对于 var2 = FALSE
的网格,A
应该是最后一个。
df <- data.frame(var1 = c(TRUE, TRUE, FALSE, FALSE, FALSE),
var2 = c('C','A','A','Z','C'),
n = c(5,10,1,3,3))
ggplot(df, aes(reorder(var2,n), n)) +
geom_col() + facet_grid(var1~.) + coord_flip()
我希望通过 n
变量对两个网格进行排序,结果应该是 FALSE
网格的 C、Z、A 和 TRUE
的 A、C、Z网格。应该有一个 ungroup()
函数用于 ggplot2
的重新排序...
奖励: 更复杂的是,我在 lares library 中有一个 tidyverse 友好函数用于计算和绘制频率 (freqs
)。它对每个变量使用 !!!variables
延迟评估,有时这些变量可能不止一个。例如,distr(df, var1, var2, var3)
或简单的 distr(df, var1)
。这就是为什么我不能(或者至少我不知道如何)将这些变量动态转换为排序因子(如果这是解决方案)的原因。
有没有一种方法可以在不使用 cowplot
或 gridExtra
的情况下创建不同的图,然后将它们全部粘贴在一起?太慢了...
这是我能解决的问题。
library(ggplot2)
df <- data.frame(var1 = c(TRUE, TRUE, FALSE, FALSE, FALSE),
var2 = as.factor(c('C','A','A','Z','C')),
n = c(5, 10, 1, 3, 3))
df$var3 <- ifelse(df$var1, paste0(df$var2, 'T'), paste0(df$var2, 'F'))
ggplot(df, aes(x = reorder(var3, n),
y = n)) +
geom_col() +
facet_grid(var1 ~ ., scales = "free", space = "free") +
coord_flip()
这对你有用吗?查看更多
library(tidyverse)
df <- data.frame(var1 = c(TRUE, TRUE, FALSE, FALSE, FALSE),
var2 = c('C','A','A','Z','C'),
n = c(5,10,1,3,3))
reorder_within <- function(x, by, within, fun = mean, sep = "___", ...) {
new_x <- paste(x, within, sep = sep)
stats::reorder(new_x, by, FUN = fun)
}
scale_x_reordered <- function(..., sep = "___") {
reg <- paste0(sep, ".+$")
ggplot2::scale_x_discrete(labels = function(x) gsub(reg, "", x), ...)
}
ggplot(df, aes(reorder_within(var2, n, var1), n)) +
geom_col() +
scale_x_reordered() +
facet_grid(var1 ~ ., scales = "free", space = "free") +
coord_flip() +
theme_minimal() +
theme(panel.grid.major.y = element_blank())
由 reprex package (v0.2.1.9000)
于 2019-03-08 创建