如何使用数值为构面网格中的每个图设置背景颜色
How to set background color for each plot in a facet grid using numeric values
我想为每个独立图的背景着色以突出相关性。整个思路是几个时间序列的自相关矩阵图。
在 this 之后,我几乎可以使用我的超级简化示例轻松理解它:
library(tidyverse)
set.seed(214)
n <- 1000
df <- tibble(v1 = runif(n), v2 = runif(n)*0.1 + v1, v3 = runif(n)*0.2 + v2, v4 = runif(n)*0.3 + v3, v5 = runif(n)*0.4 + v4, v6 = runif(n)*0.5 + v5)
C <- crossing(w1 = 1:length(df), w2 = 1:length(df)) # Alle Kombinationsmöglichkeiten
CM <- array(0, dim = c(length(df), length(df))) #Correlation Matrix
FACET_LIST <- lapply(1:nrow(C), function(c) { # c <- 14 C[c,]
tibble(a1 = unlist(df[, C$w1[c]], use.names = FALSE),
a2 = unlist(df[, C$w2[c]], use.names = FALSE),
name1 = names(df[, C$w1[c]]),
name2 = names(df[, C$w2[c]])
)
})
FACET <- do.call(rbind.data.frame, FACET_LIST)
FACET$name1 <- as_factor(FACET$name1)
FACET$name2 <- as_factor(FACET$name2)
for (i in seq_along(df)) {
for (j in seq_along(df)) {
CM[i,j] <- cor(df[i], df[j], use = "complete.obs")
}
}
dat_text <- data.frame(
name1 = rep(names(df), each = length(names(df))),
name2 = rep(names(df), length(names(df))),
R2 = paste(round(as.vector(CM) * 100, 1), "%")
)
p <- ggplot()
p <- p + geom_point(data=FACET, aes(a1, a2), size = 0.5)
p <- p + stat_smooth(data=FACET, aes(a1, a2), method = "lm")
p <- p + facet_grid(vars(name1), vars(name2)) + coord_fixed()
p <- p + geom_rect(data = dat_text, aes(fill = R2), xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, alpha = 0.3)
p <- p + geom_text(data = dat_text, aes(x = 0.3, y = 1.2, label = R2))
p <- p + scale_fill_brewer(palette = "Greens")
p
我正在寻找最后一行工作。它总是给我默认颜色。
编辑:
代码已更新;我大多具有很强的相关性,但我希望色标范围为 0% - 100%。这是它现在的样子:
所以,在您的帮助下,我找到了解决方案。首先,dat_text$R2
列必须是数字原因。添加 % 符号会将其转换为被解释为离散刻度的字符。
dat_text <- tibble(
name1 = rep(names(df), each = length(names(df))),
name2 = rep(names(df), length(names(df))),
R2 = round(as.vector(CM) * 100, 1)
)
可以在 geom_text
调用中添加百分号。然后,scale_fill_gradient
调用工作正常。我找不到将比例从 0% 固定到 100%,但最终这可能更好。否则,背景颜色之间几乎没有区别。
p <- ggplot()
p <- p + geom_point(data=FACET, aes(a1, a2), size = 0.5)
p <- p + stat_smooth(data=FACET, aes(a1, a2), method = "lm")
p <- p + facet_grid(vars(name1), vars(name2)) + coord_fixed()
p <- p + geom_rect(data = dat_text, aes(fill = R2), xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, alpha = 0.3)
p <- p + geom_text(data = dat_text, aes(x = 0.3, y = 1.2, label = paste0(R2,"%")))
p <- p + scale_fill_gradient(low = "black", high = "darkgreen", aesthetics = "fill")
p
我的最终图表是这样的:
我想为每个独立图的背景着色以突出相关性。整个思路是几个时间序列的自相关矩阵图。
在 this 之后,我几乎可以使用我的超级简化示例轻松理解它:
library(tidyverse)
set.seed(214)
n <- 1000
df <- tibble(v1 = runif(n), v2 = runif(n)*0.1 + v1, v3 = runif(n)*0.2 + v2, v4 = runif(n)*0.3 + v3, v5 = runif(n)*0.4 + v4, v6 = runif(n)*0.5 + v5)
C <- crossing(w1 = 1:length(df), w2 = 1:length(df)) # Alle Kombinationsmöglichkeiten
CM <- array(0, dim = c(length(df), length(df))) #Correlation Matrix
FACET_LIST <- lapply(1:nrow(C), function(c) { # c <- 14 C[c,]
tibble(a1 = unlist(df[, C$w1[c]], use.names = FALSE),
a2 = unlist(df[, C$w2[c]], use.names = FALSE),
name1 = names(df[, C$w1[c]]),
name2 = names(df[, C$w2[c]])
)
})
FACET <- do.call(rbind.data.frame, FACET_LIST)
FACET$name1 <- as_factor(FACET$name1)
FACET$name2 <- as_factor(FACET$name2)
for (i in seq_along(df)) {
for (j in seq_along(df)) {
CM[i,j] <- cor(df[i], df[j], use = "complete.obs")
}
}
dat_text <- data.frame(
name1 = rep(names(df), each = length(names(df))),
name2 = rep(names(df), length(names(df))),
R2 = paste(round(as.vector(CM) * 100, 1), "%")
)
p <- ggplot()
p <- p + geom_point(data=FACET, aes(a1, a2), size = 0.5)
p <- p + stat_smooth(data=FACET, aes(a1, a2), method = "lm")
p <- p + facet_grid(vars(name1), vars(name2)) + coord_fixed()
p <- p + geom_rect(data = dat_text, aes(fill = R2), xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, alpha = 0.3)
p <- p + geom_text(data = dat_text, aes(x = 0.3, y = 1.2, label = R2))
p <- p + scale_fill_brewer(palette = "Greens")
p
我正在寻找最后一行工作。它总是给我默认颜色。
编辑:
代码已更新;我大多具有很强的相关性,但我希望色标范围为 0% - 100%。这是它现在的样子:
所以,在您的帮助下,我找到了解决方案。首先,dat_text$R2
列必须是数字原因。添加 % 符号会将其转换为被解释为离散刻度的字符。
dat_text <- tibble(
name1 = rep(names(df), each = length(names(df))),
name2 = rep(names(df), length(names(df))),
R2 = round(as.vector(CM) * 100, 1)
)
可以在 geom_text
调用中添加百分号。然后,scale_fill_gradient
调用工作正常。我找不到将比例从 0% 固定到 100%,但最终这可能更好。否则,背景颜色之间几乎没有区别。
p <- ggplot()
p <- p + geom_point(data=FACET, aes(a1, a2), size = 0.5)
p <- p + stat_smooth(data=FACET, aes(a1, a2), method = "lm")
p <- p + facet_grid(vars(name1), vars(name2)) + coord_fixed()
p <- p + geom_rect(data = dat_text, aes(fill = R2), xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, alpha = 0.3)
p <- p + geom_text(data = dat_text, aes(x = 0.3, y = 1.2, label = paste0(R2,"%")))
p <- p + scale_fill_gradient(low = "black", high = "darkgreen", aesthetics = "fill")
p
我的最终图表是这样的: