ggplot2热图,固定比例色条在图之间。

10

我需要绘制三个不同的图表,并设置相同的比例范围和颜色。我有三个矩阵,它们的值范围不同。

例如:

range(matrixA) 
# 0.60 0.85  
range(matrixB) 
# 0.65 0.95  
range(matrixA) 
# 0.5 1.0

我希望图表中的填充颜色相同。例如,在差异图中所有0.8值,如果在第一个图表中为0.8橙色,我希望不同图表中的所有0.8值都是相同的橙色。

我现在遇到的问题是:

在第一个图表中,最大值的颜色是红色,然后值0.85也是红色。

在第二个图表中,最大值是红色,但在这种情况下,最大值是0.95,问题就出现了。

我的代码:

mat.melted <- melt(matrixA)
colnames(mat.melted) <- c("p","c","v")
p <- ggplot(mat.melted, aes(x=c,y=p,fill=v) + 
         geom-tile() + 
         scale_fill_gradintn(limits = c(min(as.vector(matrixA)), max(as.vector(matrixA))), 
                             colors = c("yellow","orange","red"))

请提供一个可重现的示例,通过提供您的数据或其模拟。使用 dput(mat.melted) 并将结果粘贴到问题中。顺便说一句,我想你是在谈论数据框,而不是矩阵。 - GGamba
1个回答

7
你需要为所有的元素设置相同的范围(颜色条的限制),并且指定颜色。
rng = range(matrixA, matrixB, matrixC)

将以下内容添加到你的`ggplot`代码中:
g + scale_fill_gradient2(low="green", mid="lightblue", high="red", #colors in the scale
               midpoint=mean(rng),    #same midpoint for plots (mean of the range)
               breaks=seq(0,1,0.25), #breaks in the scale bar
               limits=c(floor(rng[1]), ceiling(rng[2])))

以下是一个示例,可以帮助您获得您想要的内容:
x <- matrix(60:85, 5)/100
y <- matrix(65:95, 5)/100
z <- matrix(50:100, 5)/100


rng = range(c((x), (y), (z)))

library(reshape)
library(ggplot2)

ggplot(data = melt(x)) + geom_tile(aes(x=X1,y=X2,fill = value)) +
  scale_fill_gradient2(low="green", mid="lightblue", high="red", #colors in the scale
                   midpoint=mean(rng),    #same midpoint for plots (mean of the range)
                   breaks=seq(0,1,0.25), #breaks in the scale bar
                   limits=c(floor(rng[1]), ceiling(rng[2]))) + #same limits for plots
                   ggtitle("X")

ggplot(data = melt(y)) + geom_tile(aes(x=X1,y=X2,fill = value)) +
  scale_fill_gradient2(low="green", mid="lightblue", high="red", 
                   midpoint=mean(rng),   
                   breaks=seq(0,1,0.25), 
                   limits=c(floor(rng[1]), ceiling(rng[2]))) +
                    ggtitle("Y")                  
  
ggplot(data = melt(z)) + geom_tile(aes(x=X1,y=X2,fill = value)) +
 scale_fill_gradient2(low="green", mid="lightblue", high="red", 
                   midpoint=mean(rng),    
                   breaks=seq(0,1,0.25), 
                   limits=c(floor(rng[1]), ceiling(rng[2]))) +
                    ggtitle("Z")   

这将给你带来:


我能问一个关于图例标签的建议吗?比如说,你想要“高-平均-低”而不是“1,0.5,0.0”。你能给出如何实现这个目标的建议吗?@Masoud - Cyrillm_44
@Cyrillm_44 当然可以。看一下这个帖子 https://dev59.com/K2Ag5IYBdhLWcg3wZ6TY - M--

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接