使用 R 中的 ggplot 为每个类别生成热图 table 的渐变颜色
Gradient color for each category to generate a heatmap table using ggplot in R
我正在尝试使用 R 中的 ggplot 生成热图 table。我的数据是这样的:
dt <- cbind(rbinom(1:10,100,0.9), rbinom(1:10,100,0.5), rbinom(1:10,100,0.2), rbinom(1:10,100,0.05)
colnames(dt) <- c("A","B","C","D")
我想为每个类别使用不同的渐变色来强调每个值的重要性。由于值的范围很大,较小的数字将被着色几乎相同。这就是为什么,我想使用不同的颜色。我的代码在这里:
library(dplyr)
library(ggplot2)
library(reshape2)
library(scales)
dt <- cbind(rbinom(1:10,100,0.9), rbinom(1:10,100,0.5), rbinom(1:10,100,0.2), rbinom(1:10,100,0.01))
colnames(dt) <- c("A","B","C","D")
dt <- melt(dt)
dt %>%
ggplot(aes(Var2,Var1)) +
geom_tile(aes(fill = value), colour = "white") +
geom_text(aes(fill = dt$value, label = dt$value, 3), size = 4) +
scale_fill_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 0.05) +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
panel.background = element_rect(fill = "white"),
axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, size = 10, face = "bold"),
plot.title = element_text(size = 20, face = "bold"),
axis.text.y = element_text(size = 10, face = "bold")) +
ggtitle("Heatmap Table") +
theme(legend.title = element_text(face = "bold", size = 14)) +
scale_x_discrete(name = "") +
scale_y_discrete(name = "") +
labs(fill = "Heatmap")
剧情是这样的:
每个类别的颜色应该是渐变的。我真的很感激任何帮助。
假设我正确地解释了你的问题,我更改了映射到 fill 的变量。我没有使用原始值,而是按 Var2 分组并计算了一个相对值,因此每个值都与其组中的其他值进行了比较——例如这个值与 A 组中的所有其他值相比如何。
我也从你的 geom_text
aes
中删除了 3 因为它看起来像是一个错字。这让每个文本 geom 都与相应的图块占据相同的位置。
这种方法的一个缺点是图例上的标签现在没有太多意义,或者至少需要一些解释来说明值是根据其组进行缩放的。
编辑:我将颜色渐变的中点更改为 0.5 而不是之前的 0.05,因此在缩放值后仍会显示最小颜色。
library(dplyr)
library(ggplot2)
library(reshape2)
library(scales)
dt <- cbind(rbinom(1:10,100,0.9), rbinom(1:10,100,0.5), rbinom(1:10,100,0.2), rbinom(1:10,100,0.01))
colnames(dt) <- c("A","B","C","D")
dt <- melt(dt)
dt %>%
group_by(Var2) %>%
# make a variable for the value scaled in relation to other values in that group
mutate(rel_value = value / max(value)) %>%
ggplot(aes(Var2,Var1)) +
geom_tile(aes(fill = rel_value), colour = "white") +
# take out dt$...
# take out 3 from aes
geom_text(aes(label = value), size = 4) +
scale_fill_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 0.5) +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
panel.background = element_rect(fill = "white"),
axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, size = 10, face = "bold"),
plot.title = element_text(size = 20, face = "bold"),
axis.text.y = element_text(size = 10, face = "bold")) +
ggtitle("Heatmap Table") +
theme(legend.title = element_text(face = "bold", size = 14)) +
scale_x_discrete(name = "") +
scale_y_discrete(name = "") +
labs(fill = "Heatmap")
由 reprex package (v0.2.0) 创建于 2018-04-16。
我正在尝试使用 R 中的 ggplot 生成热图 table。我的数据是这样的:
dt <- cbind(rbinom(1:10,100,0.9), rbinom(1:10,100,0.5), rbinom(1:10,100,0.2), rbinom(1:10,100,0.05)
colnames(dt) <- c("A","B","C","D")
我想为每个类别使用不同的渐变色来强调每个值的重要性。由于值的范围很大,较小的数字将被着色几乎相同。这就是为什么,我想使用不同的颜色。我的代码在这里:
library(dplyr)
library(ggplot2)
library(reshape2)
library(scales)
dt <- cbind(rbinom(1:10,100,0.9), rbinom(1:10,100,0.5), rbinom(1:10,100,0.2), rbinom(1:10,100,0.01))
colnames(dt) <- c("A","B","C","D")
dt <- melt(dt)
dt %>%
ggplot(aes(Var2,Var1)) +
geom_tile(aes(fill = value), colour = "white") +
geom_text(aes(fill = dt$value, label = dt$value, 3), size = 4) +
scale_fill_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 0.05) +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
panel.background = element_rect(fill = "white"),
axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, size = 10, face = "bold"),
plot.title = element_text(size = 20, face = "bold"),
axis.text.y = element_text(size = 10, face = "bold")) +
ggtitle("Heatmap Table") +
theme(legend.title = element_text(face = "bold", size = 14)) +
scale_x_discrete(name = "") +
scale_y_discrete(name = "") +
labs(fill = "Heatmap")
剧情是这样的:
每个类别的颜色应该是渐变的。我真的很感激任何帮助。
假设我正确地解释了你的问题,我更改了映射到 fill 的变量。我没有使用原始值,而是按 Var2 分组并计算了一个相对值,因此每个值都与其组中的其他值进行了比较——例如这个值与 A 组中的所有其他值相比如何。
我也从你的 geom_text
aes
中删除了 3 因为它看起来像是一个错字。这让每个文本 geom 都与相应的图块占据相同的位置。
这种方法的一个缺点是图例上的标签现在没有太多意义,或者至少需要一些解释来说明值是根据其组进行缩放的。
编辑:我将颜色渐变的中点更改为 0.5 而不是之前的 0.05,因此在缩放值后仍会显示最小颜色。
library(dplyr)
library(ggplot2)
library(reshape2)
library(scales)
dt <- cbind(rbinom(1:10,100,0.9), rbinom(1:10,100,0.5), rbinom(1:10,100,0.2), rbinom(1:10,100,0.01))
colnames(dt) <- c("A","B","C","D")
dt <- melt(dt)
dt %>%
group_by(Var2) %>%
# make a variable for the value scaled in relation to other values in that group
mutate(rel_value = value / max(value)) %>%
ggplot(aes(Var2,Var1)) +
geom_tile(aes(fill = rel_value), colour = "white") +
# take out dt$...
# take out 3 from aes
geom_text(aes(label = value), size = 4) +
scale_fill_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 0.5) +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
panel.background = element_rect(fill = "white"),
axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, size = 10, face = "bold"),
plot.title = element_text(size = 20, face = "bold"),
axis.text.y = element_text(size = 10, face = "bold")) +
ggtitle("Heatmap Table") +
theme(legend.title = element_text(face = "bold", size = 14)) +
scale_x_discrete(name = "") +
scale_y_discrete(name = "") +
labs(fill = "Heatmap")
由 reprex package (v0.2.0) 创建于 2018-04-16。