繁体   English   中英

如何使用 lattice 和 levelplot 控制热图?

[英]How do I control a heatmap with lattice and levelplot?

今天早上,我开始寻找一种解决方案,从我在这里拥有的成对值表中生成热图。 我发现格子levelplots提供了看起来像我所追求的水平图。 当我设法将我的数据转换为正确的格式时,我使用了levelplot 默认颜色主题不会产生我想要的,我在 web 上找到了灰度解决方案。 但是,现在控制更多 plot 有点超出我的 scope 范围。 我不经常使用 R 并且对许多更深层次的数据结构还不是很熟悉。

我当前的命令是:

library("lattice")
matrix <- as.matrix(rev(read.table("inputfile",header=T,row.names=c(<list of ten names>))))
levelplot(matrix,col.regions = grey(100:0/100))

这是 dput 矩阵的 output:

structure(c("937.5", "652.5", "1066.5", "787.5", "229.5", "115.5", 
"787.5", "763.5", "415.5", "N/A", "1483.5", "1360.5", "1858.5", 
"1309.5", "478.5", "322.5", "1375.5", "1588.5", "N/A", "1759.5", 
"643.5", "904.5", "1189.5", "712.5", "256.5", "154.5", "829.5", 
"N/A", "403.5", "1231.5", "808.5", "1096.5", "1195.5", "913.5", 
"292.5", "187.5", "N/A", "1147.5", "478.5", "1192.5", "6712.5", 
"6373.5", "6517.5", "6058.5", "4555.5", "N/A", "6394.5", "7357.5", 
"6214.5", "6835.5", "3412.5", "3991.5", "3814.5", "3793.5", "N/A", 
"1327.5", "3994.5", "3808.5", "3307.5", "4618.5", "1261.5", "1261.5", 
"1162.5", "N/A", "310.5", "220.5", "1195.5", "1639.5", "574.5", 
"1732.5", "871.5", "847.5", "N/A", "610.5", "262.5", "172.5", 
"943.5", "985.5", "448.5", "1525.5", "940.5", "N/A", "1105.5", 
"829.5", "292.5", "160.5", "961.5", "1198.5", "538.5", "1495.5", 
"N/A", "832.5", "1009.5", "880.5", "280.5", "196.5", "952.5", 
"1357.5", "550.5", "1456.5"), .Dim = c(10L, 10L), .Dimnames = list(
    c("NA_Pacific", "NA_Central", "NA_Atlantic", "Greenland", 
    "EU_NW", "EU_WM", "EU_BS.EM", "Asia_SW", "Asia_Central", 
    "Asia_East"), c("Asia_East", "Asia_Central", "Asia_SW", "EU_BS.EM", 
    "EU_WM", "EU_NW", "Greenland", "NA_Atlantic", "NA_Central", 
    "NA_Pacific")))
  1. 这几乎创造了我想要实现的目标。 但是灰色很丑。 我如何将其更改为蓝色? 用灰色代替蓝色不起作用...

  2. 此外,它会将标签打印到我在输入表中指定的刻度上。 这适用于 y 轴,但不适用于 x 轴。 如何回收 y 轴刻度以将它们打印到 x 轴刻度(旋转 90 度)?

  3. 最后,沿 x 轴(顶部和底部)有一点点空白。 虽然这不是真正的问题,但是消除它会很好。

我希望至少可以解决一些问题。 提前致谢。

我摆弄了很多,发现刻度标签和矩阵定义现在工作得很好,因为我设法将row.names包含到矩阵中。 然而,在col.regions中使用 col.regions 的方式令人大开眼界! 我现在使用以下内容在levelplot中获取颜色渐变:

ramp <- colorRamp(c("white", "blue"))

这将创建白色和蓝色之间的渐变,但任何其他颜色都是可能的。 同时确定坡道的方向。 在这里,低值是白色,高值是蓝色。 levelplot ,我将这个斜坡与col.regions一起使用,如下所示:

col.regions=rgb(ramp(seq(0, 1, length = 1000)), max = 255)

长度应设置为任何大的值,以使其大于矩阵中不同值的数量。 否则颜色会在热图中回收。 设置max=255定义了渐变中两种颜色之间的整个范围。 将其设置为较低的值将不起作用,因为它是我使用它的方式中可接受的最低值。 将其设置得更高会将斜坡的“黑暗”向上移动,这有时也可能很好。

也许不是一个非常专业的解决方案,但它对我的情况非常有效,我可以很好地控制我的色带。 谢谢指点!

目前, matrix object 是一个字符矩阵,我希望 levelplot 与数字矩阵一起使用会更好,所以我做了:

matrix2 <-apply(matrix, 2, as.numeric)

1)您应该意识到grey是 function。 grey等其他颜色函数包括rgbhsv 也许... , col.regions=rgb(100) ) ... 假设您有 101 个不同的 x 值。 编辑:那是错误的。 rgb function 注意三个向量 arguments:试试这个:

col.regions = c(rgb(50:0/50, 0, 0),rgb(0,0:50/50,0) )  
     # ugly result but shows how to use two color ranges

2) 轴刻度标签由 scales 参数的列表参数控制。 类似于... , scales=list(x=list(labels=<label=vector>, at=<tick-positions>) )东西。 这将不同于用于设置 z-breaks 的at

3)我猜你已经通过尺寸或额外值的一些不匹配创建了沿 x 轴的空白。 默认的 levelplot 不会创建空白。 需要您的 object 的这些详细信息。 事实证明,当暗名是“字符”时存在空格,但当它们是 NULL 时不存在,所以试试这个:

rownames(matrix2) <- NULL
colnames(matrix2) <- NULL  # don't throw away matrix, we need its dimnames
levelplot(matrix2,col.regions = c(rgb(50:0/50, 0, 0),rgb(0,0:50/50,0) ), region=TRUE, 
    scales=list(x=list(rot=90, at=1:10, labels=rownames(matrix)), y=list( at=1:10, 
    labels=rownames(matrix)) ))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM