跟进this question,我想根据数据框中的变量p.value
制作一个水平图热图并为每个单元着色。
我希望单元格的颜色只有3种颜色(连续变量的离散色调):
白色表示p.values> 0.05
红色表示p.values< 0.05和> 0.01
深红色表示p.values< 0.01
到目前为止,这是我的MWE。
set.seed(150)
pv.df <- data.frame(compound=rep(LETTERS[1:8], each=3), comparison=rep(c("a/b","b/c","a/c"), 8), p.value=runif(24, 0, 0.2))
pv.df
myPanel <- function(x, y, z, ...) {
panel.levelplot(x, y, z, ...)
panel.text(x, y, round(z, 2))
}
#install.packages("latticeExtra")
library(latticeExtra)
library(RColorBrewer)
cols <- rev(colorRampPalette(brewer.pal(6, "Reds"))(10))
png(filename="test.png", height=1000, width=600)
print(
levelplot(p.value ~ comparison*compound,
pv.df,
panel = myPanel,
col.regions = cols,
colorkey = list(col = cols,
at = do.breaks(range(pv.df$p.value), 10)),
xlab = "", ylab = "", # remove axis titles
scales = list(x = list(rot = 45), # change rotation for x-axis text
cex = 0.8), # change font size for x- & y-axis text
main = list(label = "Total FAME abundance - TREATMENT",
cex = 1.5)) # change font size for plot title
)
dev.off()
产生:
我在水平图中显示实际的p.value
值。上面的代码似乎有问题,因为&#34; 0.14&#34;颜色比&#34; 0.08&#34;更暗。就在旁边。
答案 0 :(得分:2)
您没有指定要用于区域的断点(就像您对colorkey所做的那样),因此颜色中的混色。
如果您希望区域为<=0.01
,>0.01 & <=0.05
和>0.05
,则需要使用levelplot
参数在at
调用中指定区域(和当然colorkey
)也一样。
因此,在通话中,您需要告诉您要为不同区域(col.regions = c("darkred", "red", "white")
)的颜色为“黑暗”,“红色”和“白色”,中断为0(实际下限) ,0.01,0.05和0.20(上限,这是p.value
的最大data.frame
的一种舍入。
您的levelplot
电话就是:
levelplot(p.value ~ comparison*compound,
pv.df,
panel = myPanel,
col.regions = c("darkred", "red", "white"),
at=c(0, 0.01, 0.05, 0.20),
colorkey = list(col = c("darkred", "red", "white"),
at = c(0, 0.01, 0.05, 0.20)),
xlab = "", ylab = "", # remove axis titles
scales = list(x = list(rot = 45), # change rotation for x-axis text
cex = 0.8), # change font size for x- & y-axis text
main = list(label = "Total FAME abundance - TREATMENT",
cex = 1.5))
,并提供:
注意: 我根据您对中断的描述进行了调用,对于您在代码中使用的中断,您需要添加at = do.breaks(range(pv.df$p.value), 10))
在通话中(例如,在定义col.regions
后)