为连续变量制作离散值的调色板(格子水平图)
Make color palette of discretized values for a continuous variable (lattice levelplot)
跟进 ,我想制作一个水平图热图并根据数据框中的变量 p.value
为每个单元格着色。
我想让单元格以只有 3 种颜色的方式着色(连续变量的离散调色板):
白色 for p.values >0.05
red for p.values <0.05 and >0.01
深红色 for 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
值。上面的代码似乎有问题,因为“0.14”的颜色比它旁边的“0.08”要深。
您没有指定要用于区域的断点(就像您为色键所做的那样),因此颜色混杂。
如果您希望区域为 <=0.01
、>0.01 & <=0.05
和 >0.05
,您需要在 levelplot
调用中使用 at
参数指定它(当然 colorkey
也一样)。
因此,在调用中,您需要告知您想要不同区域 (col.regions = c("darkred", "red", "white")
) 的颜色 "darkred"、"red" 和 "white"在 0(实际上是下限)、0.01、0.05 和 0.20(上限,这是对 data.frame
的最大值 p.value
的一种舍入)处中断。
您的 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))
给予:
N.B.: 我是根据你对休息时间的描述打电话的你在你的代码中使用,你需要在调用中添加at = do.breaks(range(pv.df$p.value), 10))
(例如,在定义col.regions
之后)
跟进 p.value
为每个单元格着色。
我想让单元格以只有 3 种颜色的方式着色(连续变量的离散调色板):
白色 for p.values >0.05
red for p.values <0.05 and >0.01
深红色 for 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
值。上面的代码似乎有问题,因为“0.14”的颜色比它旁边的“0.08”要深。
您没有指定要用于区域的断点(就像您为色键所做的那样),因此颜色混杂。
如果您希望区域为 <=0.01
、>0.01 & <=0.05
和 >0.05
,您需要在 levelplot
调用中使用 at
参数指定它(当然 colorkey
也一样)。
因此,在调用中,您需要告知您想要不同区域 (col.regions = c("darkred", "red", "white")
) 的颜色 "darkred"、"red" 和 "white"在 0(实际上是下限)、0.01、0.05 和 0.20(上限,这是对 data.frame
的最大值 p.value
的一种舍入)处中断。
您的 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))
给予:
N.B.: 我是根据你对休息时间的描述打电话的你在你的代码中使用,你需要在调用中添加at = do.breaks(range(pv.df$p.value), 10))
(例如,在定义col.regions
之后)