Я создаю зеркальную гистограмму, используя плотности переменных, взятых из двух разных наборов данных, структурированных следующим образом:
library(ggplot2)
data(iris)
ggplot()+
geom_histogram(data=iris, aes(x=Sepal.Width, y=..density..), fill='#56B4E9')+
geom_histogram(data=iris, aes(x=Sepal.Length, y= -..density..), fill='#D55E00')
Что создает:
Однако я хотел бы отобразить один и тот же график для нескольких пар переменных, поэтому я устанавливаю следующее:
var_list <- list(x = names(iris[1:4])) #define named variables
plots <- map(.x = var_list$x[1:4], #map to names
~ {
ggplot()+
geom_histogram(data=iris, aes_string(x=.x, y=..density..), fill='#56B4E9')+
geom_histogram(data=iris, aes_string(x=.x, y=-..density..), fill='#D55E00')
}
)
Это бросает Error in aes_string(x = .x, y = ..density..) : object '..density..' not found
Я вижу, что есть проблема с передачей ..density.. в aes_string() при сопоставлении, но я не могу ее решить. Я предполагаю, что мне может понадобиться использовать map2 и указать .y = , но я не могу понять это.
Любые советы приветствуются.





Поскольку я не знаю, как комбинаторика должна играть роль в вашем примере, я просто принял во внимание 6 различных возможностей выбора 2 разных столбцов из 4.
Прикрепил пример. Я использовал combn(), чтобы найти 6 комбинаций и сохранил результат в списке var_list.
library(ggplot2)
library(purrr)
data(iris)
# combn to get the choose(4, 2) combinations:
var_list <- combn(names(iris[1:4]), 2, simplify = F) #define named variables
var_list
#> [[1]]
#> [1] "Sepal.Length" "Sepal.Width"
#>
#> [[2]]
#> [1] "Sepal.Length" "Petal.Length"
#>
#> [[3]]
#> [1] "Sepal.Length" "Petal.Width"
#>
#> [[4]]
#> [1] "Sepal.Width" "Petal.Length"
#>
#> [[5]]
#> [1] "Sepal.Width" "Petal.Width"
#>
#> [[6]]
#> [1] "Petal.Length" "Petal.Width"
## Version with aes_string():
plots <- map(var_list, #map to names
~ {
ggplot()+
geom_histogram(data=iris, aes_string(x= .x[1], y = "..density.."), fill='#56B4E9') +
geom_histogram(data=iris, aes_string(x= .x[2], y = "-..density.."), fill='#D55E00')
}
)
## Better using aes(), see comment:
plots2 <- map(var_list, #map to names
~ {
ggplot()+
geom_histogram(data=iris, aes(x = .data[[.x[1]]], y = ..density..), fill='#56B4E9') +
geom_histogram(data=iris, aes(x = .data[[.x[2]]], y = -..density..), fill='#D55E00')
}
)
Created on 2022-05-09 by the reprex package (v2.0.1)
Возможно, это то, что вы искали.
combn() не требуется, так как я рисую из разных наборов данных для каждой половины гистограммы. Ваше решение решило проблему. Очень признателен.
Не используйте
aes_string. Используйте местоимение.data:aes(x=.data[[.x]], y=..density..). Это текущий рекомендуемый способ с последними версиями ggplot.