Как установить одинаковые масштабы для разных граней с помощью ggpairs()
У меня есть следующий набор данных и коды для построения графика контура 2d плотности для каждой пары переменных во фрейме данных. Мой вопрос заключается в том, существует ли способ в ggpairs(), чтобы убедиться, что шкалы одинаковы для разных пар переменных, например, одинаковые шкалы для разных фасетов в ggplot2. Например, я хотел бы, чтобы масштаб x и масштаб y были от [-1, 1] для каждого изображения.
Заранее спасибо!
Сюжет выглядит так
library(GGally)
ggpairs(df,upper = list(continuous = "density"),
lower = list(combo = "facetdensity"))
#the dataset looks like
print(df)
x y z w
1 0.49916998 -0.07439680 0.37731097 0.0927331640
2 0.25281542 -1.35130718 1.02680343 0.8462638556
3 0.50950876 -0.22157249 -0.71134553 -0.6137126948
4 0.28740609 -0.17460743 -0.62504812 -0.7658094835
5 0.28220492 -0.47080289 -0.33799637 -0.7032576540
6 -0.06108038 -0.49756810 0.49099505 0.5606988283
7 0.29427440 -1.14998030 0.89409384 0.5656682378
8 -0.37378096 -1.37798177 1.22424964 1.0976507702
9 0.24306941 -0.41519951 0.17502049 -0.1261603208
10 0.45686871 -0.08291032 0.75929106 0.7457002259
11 -0.16567173 -1.16855088 0.59439600 0.6410396945
12 0.22274809 -0.19632766 0.27193362 0.5532901113
13 1.25555629 0.24633499 -0.39836999 -0.5945792966
14 1.30440121 0.05595755 1.04363679 0.7379212885
15 -0.53739075 -0.01977930 0.22634275 0.4699563173
16 0.17740551 -0.56039760 -0.03278126 -0.0002523205
17 1.02873716 0.05929581 -0.74931661 -0.8830775310
18 -0.13417946 -0.60421101 -0.24532606 -0.1951831558
19 0.11552305 -0.14462104 0.28545703 -0.2527437818
20 0.71783902 -0.12285529 1.23488185 1.3224880574
3 ответа
Я нашел способ сделать это в течение ggpairs
который использует пользовательскую функцию для создания графиков
df <- read.table("test.txt")
upperfun <- function(data,mapping){
ggplot(data = data, mapping = mapping)+
geom_density2d()+
scale_x_continuous(limits = c(-1.5,1.5))+
scale_y_continuous(limits = c(-1.5,1.5))
}
lowerfun <- function(data,mapping){
ggplot(data = data, mapping = mapping)+
geom_point()+
scale_x_continuous(limits = c(-1.5,1.5))+
scale_y_continuous(limits = c(-1.5,1.5))
}
ggpairs(df,upper = list(continuous = wrap(upperfun)),
lower = list(continuous = wrap(lowerfun))) # Note: lower = continuous
С такой функцией он настраивается так же, как и любой ggplot!
Я не уверен, возможно ли это напрямую из функции ggpairs, но вы можете извлечь график из ggpairs и изменить его, а затем сохранить его обратно.
Этот пример зацикливается на нижнем треугольнике матрицы графиков и заменяет существующие шкалы осей x и y.
data(tips, package = "reshape")
## pm is the original ggpair object
pm <- ggpairs(tips[,c("total_bill", "tip", "size")])
## pm2 will be modified in the loop
pm2 <- pm
for(i in 2:pm$nrow) {
for(j in 1:(i-1)) {
pm2[i,j] <- pm[i,j] +
scale_x_continuous(limits = c(-5, 75)) +
scale_y_continuous(limits = c(-5, 10))
}
}
pm
выглядит так
а также pm2
выглядит так
Чтобы решить вашу проблему, вы должны перебрать всю матрицу графиков и установить для шкал x и y ограничения от -1 до 1.
Основываясь на ответе @see24, я заметил, что ось x диагональных графиков плотности отключена. Это можно смягчить двумя различными способами:
- дополнительно определив функцию
diagfun
для диагональных элементовggpairs
выход. - если вас не слишком волнует вертикальная ось графиков плотности, можно просто добавить
scale_x_continuous(...)
а такжеscale_y_continuous(limits = c(-1.5,1.5))
глобально кggpairs()
выход.
Способ 1
library(GGally)
#> Loading required package: ggplot2
#> Registered S3 method overwritten by 'GGally':
#> method from
#> +.gg ggplot2
df <- read.table(text =
" x y z w
1 0.49916998 -0.07439680 0.37731097 0.0927331640
2 0.25281542 -1.35130718 1.02680343 0.8462638556
3 0.50950876 -0.22157249 -0.71134553 -0.6137126948
4 0.28740609 -0.17460743 -0.62504812 -0.7658094835
5 0.28220492 -0.47080289 -0.33799637 -0.7032576540
6 -0.06108038 -0.49756810 0.49099505 0.5606988283
7 0.29427440 -1.14998030 0.89409384 0.5656682378
8 -0.37378096 -1.37798177 1.22424964 1.0976507702
9 0.24306941 -0.41519951 0.17502049 -0.1261603208
10 0.45686871 -0.08291032 0.75929106 0.7457002259
11 -0.16567173 -1.16855088 0.59439600 0.6410396945
12 0.22274809 -0.19632766 0.27193362 0.5532901113
13 1.25555629 0.24633499 -0.39836999 -0.5945792966
14 1.30440121 0.05595755 1.04363679 0.7379212885
15 -0.53739075 -0.01977930 0.22634275 0.4699563173
16 0.17740551 -0.56039760 -0.03278126 -0.0002523205
17 1.02873716 0.05929581 -0.74931661 -0.8830775310
18 -0.13417946 -0.60421101 -0.24532606 -0.1951831558
19 0.11552305 -0.14462104 0.28545703 -0.2527437818
20 0.71783902 -0.12285529 1.23488185 1.3224880574")
upperfun <- function(data,mapping){
ggplot(data = data, mapping = mapping)+
geom_density2d()+
scale_x_continuous(limits = c(-1.5,1.5))+
scale_y_continuous(limits = c(-1.5,1.5))
}
lowerfun <- function(data,mapping){
ggplot(data = data, mapping = mapping)+
geom_point()+
scale_x_continuous(limits = c(-1.5,1.5))+
scale_y_continuous(limits = c(-1.5,1.5))
}
diagfun <- function (data, mapping, ..., rescale = FALSE){
# code based on GGally::ggally_densityDiag
mapping <- mapping_color_to_fill(mapping)
p <- ggplot(data, mapping) + scale_y_continuous()
if (identical(rescale, TRUE)) {
p <- p + stat_density(aes(y = ..scaled.. *
diff(range(x,na.rm = TRUE)) +
min(x, na.rm = TRUE)),
position = "identity",
geom = "line",
...)
} else {
p <- p + geom_density(...)
}
p +
scale_x_continuous(limits = c(-1.5,1.5)) #+
# scale_y_continuous(limits = c(-1.5,1.5))
}
ggpairs(df,
upper = list(continuous = wrap(upperfun)),
diag = list(continuous = wrap(diagfun)), # Note: lower = continuous
lower = list(continuous = wrap(lowerfun))) # Note: lower = continuous
Создано 13 января 2022 г. reprex (v2.0.1)
Способ 2
library(GGally)
#> Loading required package: ggplot2
#> Registered S3 method overwritten by 'GGally':
#> method from
#> +.gg ggplot2
df <- read.table(text =
" x y z w
1 0.49916998 -0.07439680 0.37731097 0.0927331640
2 0.25281542 -1.35130718 1.02680343 0.8462638556
3 0.50950876 -0.22157249 -0.71134553 -0.6137126948
4 0.28740609 -0.17460743 -0.62504812 -0.7658094835
5 0.28220492 -0.47080289 -0.33799637 -0.7032576540
6 -0.06108038 -0.49756810 0.49099505 0.5606988283
7 0.29427440 -1.14998030 0.89409384 0.5656682378
8 -0.37378096 -1.37798177 1.22424964 1.0976507702
9 0.24306941 -0.41519951 0.17502049 -0.1261603208
10 0.45686871 -0.08291032 0.75929106 0.7457002259
11 -0.16567173 -1.16855088 0.59439600 0.6410396945
12 0.22274809 -0.19632766 0.27193362 0.5532901113
13 1.25555629 0.24633499 -0.39836999 -0.5945792966
14 1.30440121 0.05595755 1.04363679 0.7379212885
15 -0.53739075 -0.01977930 0.22634275 0.4699563173
16 0.17740551 -0.56039760 -0.03278126 -0.0002523205
17 1.02873716 0.05929581 -0.74931661 -0.8830775310
18 -0.13417946 -0.60421101 -0.24532606 -0.1951831558
19 0.11552305 -0.14462104 0.28545703 -0.2527437818
20 0.71783902 -0.12285529 1.23488185 1.3224880574")
ggpairs(df,
upper = list(continuous = "density"),
lower = list(combo = "facetdensity")) +
scale_x_continuous(limits = c(-1.5,1.5)) +
scale_y_continuous(limits = c(-1.5,1.5))
#> Scale for 'y' is already present. Adding another scale for 'y', which will
#> replace the existing scale.
#> Scale for 'y' is already present. Adding another scale for 'y', which will
#> replace the existing scale.
#> Scale for 'y' is already present. Adding another scale for 'y', which will
#> replace the existing scale.
#> Scale for 'y' is already present. Adding another scale for 'y', which will
#> replace the existing scale.
Создано 13 января 2022 г. пакетомпакетом reprex (v2.0.1)