为负值和正值定义颜色渐变,使用scale_fill_gradientn()函数。

10

R版本3.1.1(2014-07-10) 平台:i386-w64-mingw32 / i386(32位)

我正在使用ggplot2()绘制热图,值从-1到+1。我想实现负值具有从深蓝色(-1)到浅蓝色(-0.00000001)的蓝色渐变,而正值则由浅红色(0.00000001)到深红色(1)的红色渐变。小值不应淡入白色,因为零值应为白色,并且0和小值之间应该有明显的对比度。NA值应为灰色。

我尝试过scale_fill_gradient2()scale_fill_gradientn(),还使用了rescale()

一个类似的主题已经讨论过,但是在我的情况下我无法解决这个问题:

是否可以定义scale_fill_gradient2()中的“中”范围?

ggplot2正负值不同的颜色渐变

数据(正值和负值):

data.clean <- structure(list(`1` = c(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
), `2` = c(-0.742791272678673, -0.637008381689233, -0.678722760290557, 
-0.374604178402531, -0.752540076766764, -0.741425721633379, -0.790950497422989, 
-0.822779886175826, -0.696227459496285, -0.698453447846652), 
`3` = c(-0.525688574069743, -0.43137330754352, -0.363377723970944, 
-0.210140400587573, -0.532475351847671, -0.587485278919413, 
-0.683607015861601, -0.630387125338536, -0.494214515339252, 
-0.566343042071197), `4` = c(-0.311771191820642, -0.320141843971631, 
-0.20021186440678, -0.0798166672550588, -0.369634479817365, 
-0.452880524911674, -0.526639098645571, -0.401771184676448, 
-0.278097123757212, -0.367096091610655), `5` = c(-0.247251829329413, 
-0.22468085106383, -0.115738498789346, 0, -0.305938135019192, 
-0.355658903549883, -0.356666267130129, -0.25741406255345, 
-0.0161801962913287, -0.0980209111277072), `6` = c(-0.0459977502311025, 
-0.150870406189555, -0.0659806295399516, 0, -0.200647249190939, 
-0.248640853702502, -0.269487394622238, -0.145798738610008, 
0.889467675181961, -0.0158700522778193), `7` = c(0.122867924528302, 
-0.107079303675048, -0.0558414043583535, 0, -0.143962770627932, 
-0.198013555411349, -0.185704582684086, 0.387784090909091, 
0.639289282146425, 0.410557184750733), `8` = c(0.985358490566038, 
-0.0924822695035461, -0.0304933414043584, 0, -0.088620456084895, 
-0.139027086788281, -0.0479443845139638, 0.715909090909091, 
0.856286570572285, 0.98533724340176), `9` = c(1, -0.0658736299161831, 
-0.0118038740920097, 0, -0.0431499460625674, -0.0776912538755498, 
0.475849731663685, 1, 1, 1), `10` = c(0.692830188679245, 
-0.031063829787234, -0.00579600484261501, 0, -0.0319485211108602, 
-0.0461460811882616, 0.60169946332737, 0.772727272727273, 
0.44955044955045, 0.765591397849462), `11` = c(0.489056603773585, 
-0.00773694390715667, -0.0045475181598063, 0, -0.0309324904041544, 
-0.0235537289398419, 1, 0.574090909090909, 0.0749250749250749, 
0.668621700879765), `12` = c(0.649056603773585, 0.170212765957447, 
0, 0, -0.0238328190461855, -0.0173047804455981, 0.692307692307692, 
0.353977272727273, 0.0784929356357928, 0.617790811339198), 
`13` = c(0.78188679245283, 0.723404255319149, 0, 0, -0.00752615338300595, 
0.559210526315789, 0.471124031007752, 0.298295454545455, 
0.096118167546739, 0.551319648093842), `14` = c(0.679245283018868, 
0.791489361702128, 0, 0, -0.00150523067660119, 0.785526315789474, 
0.453488372093023, 0.130681818181818, 0.121735407449693, 
0.183773216031281), `15` = c(0.414943396226415, 1, 0, 0, 
-0.000376307669150297, 0.793421052631579, 0.433810375670841, 
0, 0, 0.183773216031281), `16` = c(0.250415094339623, 0, 
0, 0, 1, 1, 0.509838998211091, 0, 0, 0.899315738025415), 
`17` = c(0, 0, 0, 0, 0, 0.720789473684211, 0.447227191413238, 
0, 0, 0), `18` = c(0, 0, 0, 0, 0, 0.868421052631579, 0.374955277280859, 
0, 0, 0), `19` = c(0, 0, 0, 0, 0, 0, 0.584376863446631, 0, 
0, 0), `20` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Type = structure(1:10, .Label = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 
"13", "14", "15", "16", "17", "18", "19", "20", "21", "22", 
"23", "24", "25", "26", "27", "28", "29", "30", "31", "32", 
"33", "34", "35", "36", "37", "38", "39", "40", "41", "42", 
"43", "44", "45", "46", "47", "48", "49", "50", "51", "52", 
"53"), class = "factor")), .Names = c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
"16", "17", "18", "19", "20", "Type"), row.names = c(NA, 10L), class = "data.frame")

数据(仅为正数):

data.clean <- structure(list(`1` = c(0.709932715640856, 0.943366065311715, 
0.954871794871795, 1, 0.810404161664666, 1, 0.349208911850178, 
0.502441037735849, 1, 0.948646446923173), `2` = c(0.657238583719391, 
0.919799040876913, 1, 0.826392095299658, 1, 0.899561128526646, 
0.395221181788828, 0.838679245283019, 0.921675990953458, 1), 
`3` = c(0.838710566953452, 1, 0.747511312217195, 0.601856127066211, 
0.706962785114046, 0.737993730407523, 0.688440426218922, 
1, 0.665158909653613, 0.857250281990224), `4` = c(0.881866313699537, 
0.959123087462891, 0.607541478129713, 0.392464678178964, 
0.483393357342937, 0.629968652037618, 1, 0.826297169811321, 
0.46194500654684, 0.719388394535656), `5` = c(0.78590337524818, 
0.9762502854533, 0.522956259426848, 0.192815587773571, 0.365266106442577, 
0.482445141065831, 0.870649015175977, 0.612240566037736, 
0.360195214855374, 0.618310565233739), `6` = c(0.864493712772998, 
0.816396437542818, 0.477828054298643, 0.112845138055222, 
0.256982793117247, 0.420062695924765, 0.71139812721989, 0.575471698113208, 
0.260135698131175, 0.452390650457451), `7` = c(1, 0.833523635533227, 
0.4, 0.0793702096223105, 0.155822328931573, 0.347586206896552, 
0.524701323861802, 0.430672169811321, 0.175979050113082, 
0.326356686301542), `8` = c(0.738335539377895, 0.737611326786938, 
0.352941176470588, 0.0473266229568751, 0.111644657863145, 
0.310971786833856, 0.384780970831988, 0.311320754716981, 
0.0910605880252351, 0.211743326231357), `9` = c(0.521178027796162, 
0.650833523635533, 0.364705882352941, 0.045064179517961, 
0.127450980392157, 0.351097178683386, 0.27788182111721, 0.265330188679245, 
0.0636828948934651, 0.145412959017421), `10` = c(0.412599272005295, 
0.554921214889244, 0.407843137254902, 0.0367069904885031, 
0.0789915966386555, 0.273981191222571, 0.256161877085351, 
0.173349056603774, 0.0484942268777526, 0.161204411580399), 
`11` = c(0.322634017207148, 0.364238410596026, 0.378280542986425, 
0.0267799427463293, 0.0424169667867147, 0.295297805642633, 
0.267807555699064, 0.13561320754717, 0.0535650517795501, 
0.129715503195889), `12` = c(0.251282263401721, 0.231788079470199, 
0.313725490196078, 0.0221627112383415, 0.0256102440976391, 
0.150470219435737, 0.23680981595092, 0.148372641509434, 0.0664992262825854, 
0.0552230855996992), `13` = c(0.173726009265387, 0.147841973053209, 
0.251674208144796, 0, 0, 0.058307210031348, 0.139920353029814, 
0.202830188679245, 0.0614212593738841, 0.0547687680160421
), `14` = c(0.194200860357379, 0.115734185887189, 0.242413273001508, 
0, 0, 0, 0.102034226670972, 0.101415094339623, 0.017259850017855, 
0.062131846096002), `15` = c(0.162213214206927, 0, 0.135746606334842, 
0, 0, 0, 0.0565062964158863, 0.0790683962264151, 0, 0.0274157162551698
), `16` = c(0.0654230090447827, 0, 0.0588235294117647, 0, 
0, 0, 0.0742654181465935, 0.122641509433962, 0, 0), `17` = c(0, 
0, 0.107119155354449, 0, 0, 0, 0, 0.188679245283019, 0, 0
), `18` = c(0, 0, 0.110316742081448, 0, 0, 0, 0, 0.265070754716981, 
0, 0), `19` = c(0, 0, 0.2473604826546, 0, 0, 0, 0, 0.220518867924528, 
0, 0), `20` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Type = structure(1:10, .Label = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"), class = "factor")), .Names = c("1",     "2", "3", "4", 
"5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
"16", "17", "18", "19", "20", "Type"), row.names = c(NA, 10L), class = "data.frame")
代码使用了ggplot2reshape2RColorBrewer。以下代码已经工作得相当不错,但是一旦我只有正数值,那么正数值也会变成蓝色。
data.m  <- melt(data.clean, id = "Type") 

bl <- colorRampPalette(c("navy","royalblue","lightskyblue"))(200)                      
re <- colorRampPalette(c("mistyrose", "red2","darkred"))(200)

ggplot(data.m, aes(x=variable, y=Type, fill=value)) +
  geom_tile(colour = "grey92", size = 0.5) +
  scale_fill_gradientn(colours=c(bl,"white", re), na.value = "grey98")

我尝试了重新缩放函数,但是我无法处理它。我没有得到任何好的结果。

ggplot(data.m, aes(x=variable, y=Type, fill=value)) +
  geom_tile(colour = "grey92", size = 0.5) +
  scale_fill_gradientn(colours=c(bl,"white", re), na.value = "grey98",
  values = rescale(c(-1,-0.001,0,0.001,1)))

我希望你能帮助我!

非常感谢!


感谢提示。我现在已经包含它了。 - VDK
1
实际上你是正确的。答案也在那个问题中。我之前确实读过它。但是我的注意力没有限制,因此我无法在那篇文章中找到答案。我以为我犯了不同的错误。thothal 给了我正确的提示。 - VDK
不总是容易发现类似的问题,但绝对给你+1赞,因为你提供了清晰的问题描述、可重现的示例以及你尝试过的代码。干杯! - Henrik
1个回答

11
你需要在 scale_fill_gradientn 中指定 limits 参数:
data.m <- melt(data.clean, id = "Type")
p <- ggplot(data.m, aes(x = variable, y = Type, fill = value) + geom_tile() +
         scale_fill_gradientn(colours=c(bl,"white", re), na.value = "grey98",
         limits = c(-1, 1)) 
p
p %+% transform(data.m, value = abs(value))

将呈现以下两个图表:

所有值 正值


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