更新:现在删除了不相关的序言并更新了进度。
嗨,我正在尝试像热图一样犁一个水平条,它将根据以下值改变颜色。默认情况下,该条应为红色,但会根据两个参数的值更改颜色。
我发现了一些尝试对 SO 产生类似效果的页面:R matrix plot with color threshold and grid
所以我认为最好的方法是水平绘制一系列瓷砖,每个瓷砖都有一个基于两个值的计算颜色。
我设法做的是生成我想要的颜色。我通过获取一个矩阵 [2xn] 来做到这一点,其中 n 是瓷砖的数量。第 1 行包含每个图块的值 1,第 2 行包含每个图块的值 2:
colourmatrix[,c(1:5)]
[,1] [,2] [,3] [,4] [,5]
"81" "82" "82" "82" "82"
"58" "58" "58" "58" "58"
然后,我通过将以下内容应用于所有列来为每个图块生成颜色:
col.deter <- function(invalues) {
cols <- rgb(green=invalues[1], red=100, blue=invalues[2], maxColorValue=100)
return(cols)
}
cols <- unlist(lapply(1:ncol(colourmatrix), function(i) col.deter(colourmatrix[,i])))
然后我做了一个 rbind() 我的结果是:
> colourmatrix[,c(1:5)]
[,1] [,2] [,3] [,4] [,5]
"81" "82" "82" "82" "82"
"58" "58" "58" "58" "58"
cols "#FFCF94" "#FFD194" "#FFD194" "#FFD194" "#FFD194"
所以对于每个图块,值 1 越高,添加到混合中的绿色越多,值 2 越高,添加到混合中的蓝色越多。因此,每个图块的颜色都被确定并添加为第三行。
我现在想要做的是类似于此页面中生成的网格,其中 ggplot2 在此代码的答案中:
dat <- expand.grid(blue=seq(0, 100, by=10), red=seq(0, 100, by=10))
dat <- within(dat, mix <- rgb(green=0, red=red, blue=blue, maxColorValue=100))
library(ggplot2)
ggplot(dat, aes(x=red, y=blue)) +
geom_tile(aes(fill=mix), color="white") +
scale_fill_identity()
但想象只有一行。我试图实现从左到右的一行瓷砖,它们的颜色由生成的值决定。
我试图用 ggplot2 和 image() 来做到这一点,但我的尝试失败了,而且我通常不使用 ggplot 2 我不理解 aes 和我得到的所有错误,但我试过了,因为那是过去的生成由上面的代码块生成的红色和蓝色瓦片图。
我失败的尝试:
ggplot(c(1,ncol(colourmatrix)), 1, aes(x=x, y=y)) +
geom_tile(aes(fill=colourmatrix[3,]), color="white") +
scale_fill_identity()
Error in ggplot.data.frame(fortify(data, ...), mapping) :
Mapping should be created with aes or aes_string
qplot(c(1,ncol(colourmatrix)), c(1,ncol(colourmatrix)), fill=colourmatrix[3,], geom='tile')
Error: Aesthetics must either be length one, or the same length as the dataProblems:c(1, ncol(colourmatrix)), c(1, ncol(colourmatrix))
我也有一些失败的尝试尝试 image() 我读过的页面来尝试实现这一点:
谢谢,
本·W。