我正在将数字矩阵转换为颜色矩阵; 然而,颜色没有正确显示,例如,颜色矩阵显示相对于数字矩阵中指定数字的不正确颜色.
我首先将颜色分配给一组数值.
cols <- c(
'0' = "#FFFFFF",
'1' = "#9AFC7F",
'2' = "#77F255",
'3' = "#60DF3D",
'4' = "#49C925",
'5' = "#37B215",
'6' = "#219900"
)
Run Code Online (Sandbox Code Playgroud)
然后生成了几个矩阵.
Map1 <- read.table(text="
1 1 1 0 0 1 1 0 2 1
1 1 1 1 0 1 1 1 2 1
0 1 1 0 2 2 1 1 1 1
0 1 1 1 1 1 2 1 2 2
1 1 2 1 1 1 1 1 2 2
1 1 1 1 1 2 2 1 2 2
1 2 0 1 1 2 1 2 1 2
0 2 2 0 1 1 1 1 1 1
0 1 1 0 0 1 2 2 1 0
0 1 1 1 1 1 1 1 1 0
")
Map2 <- read.table(text="
1 2 1 1 1 1 1 0 2 1
1 1 1 1 1 1 1 1 1 1
0 2 1 1 1 2 1 1 1 1
0 0 1 2 2 1 2 2 3 2
0 1 2 2 1 1 2 2 2 2
1 1 0 2 1 1 3 2 3 3
1 1 2 2 1 2 2 2 1 2
0 1 2 2 1 2 2 2 1 2
1 1 2 1 1 1 1 2 1 1
1 1 1 1 1 1 1 1 1 1
")
Run Code Online (Sandbox Code Playgroud)
在绘制矩阵后,我发现颜色与它们应该分配的值不匹配.
image(1:nrow(Map1), 1:ncol(Map1), t(apply(Map1, 2, rev)), col=cols, xaxt='n', yaxt='n', ann=FALSE, bty='n', asp = 1)
image(1:nrow(Map2), 1:ncol(Map2), t(apply(Map2, 2, rev)), col=cols, xaxt='n', yaxt='n', ann=FALSE, bty='n', asp = 1)
Run Code Online (Sandbox Code Playgroud)
我一直难以理解为什么数字和颜色没有对齐.绘制分配的数字以cols生成正确的序列.
d <- read.table(text="0 1 2 3 4 5 6")
image(1:nrow(d), 1:ncol(d), t(apply(d, 2, rev)), col=cols, xaxt='n', yaxt='n', ann=FALSE, bty='n', asp = 1)
Run Code Online (Sandbox Code Playgroud)
6第一个数字矩阵中没有任何值,因此第一个颜色矩阵中不应有任何黑色方块.看起来好像的值2给出分配给颜色6在所述第一矩阵,并且3向6在所述第二.
3在第一个数字矩阵中添加a 似乎会将其他值向下移动到色标,即矩阵中的最大数字被指定为最暗的颜色,而不是指定的颜色cols.
Map1.2 <- read.table(text="
1 1 1 0 0 1 1 0 2 1
1 1 1 1 0 1 1 1 2 1
3 1 1 0 2 2 1 1 1 1
0 1 1 1 1 1 2 1 2 2
1 1 2 1 1 1 1 1 2 2
1 1 1 1 1 2 2 1 2 2
1 2 0 1 1 2 1 2 1 2
0 2 2 0 1 1 1 1 1 1
0 1 1 0 0 1 2 2 1 0
0 1 1 1 1 1 1 1 1 0
")
image(1:nrow(Map1), 1:ncol(Map1), t(apply(Map1, 2, rev)), col=cols, xaxt='n', yaxt='n', ann=FALSE, bty='n', asp = 1)
image(1:nrow(Map1.2), 1:ncol(Map1.2), t(apply(Map1.2, 2, rev)), col=cols, xaxt='n', yaxt='n', ann=FALSE, bty='n', asp = 1)
Run Code Online (Sandbox Code Playgroud)
我认为你在将数字映射到字符方面存在问题.如果 我将第一种颜色改为红色(而不是白色),使值更加明显. 检查颜色定义: 现在按名称索引: 正如您所指出的,问题在于颜色是由矩阵中的值决定的。这是因为 因此,要纠正图像,您可以执行以下操作: 这是另一个例子: 一些旁注:
x是数字,那么cols[x]将按编号引用矢量,而不是按名称引用...
Run Code Online (Sandbox Code Playgroud)
cols <- c('0' = "#FF0000",'1' = "#9AFC7F",'2' = "#77F255",'3' = "#60DF3D",
'4' = "#49C925",'5' = "#37B215",'6' = "#219900")
Run Code Online (Sandbox Code Playgroud)
plot(0:6,rep(1,7),col=cols,pch=16,cex=5,ylim=c(0.9,1.1),
axes=FALSE,ann=FALSE,mar=c(0,0,0,0))
Run Code Online (Sandbox Code Playgroud)
m <- matrix(0:5,ncol=2)
image(m,col=cols[m]) ## index by number
Run Code Online (Sandbox Code Playgroud)
image(m,col=cols[as.character(m)])
image()矩阵中的值会自动分布到所提供的颜色范围内。要按照您的预期传播它们,您需要设置参数zlim以覆盖向量的长度。请查看帮助页面 ( ?image) 了解更多详细信息。
Run Code Online (Sandbox Code Playgroud)
cols <- c("#FFFFFF", "#9AFC7F", "#77F255", "#60DF3D", "#49C925", "#37B215", "#219900")
Map1 <- read.table(text="
1 1 1 0 0 1 1 0 2 1
1 1 1 1 0 1 1 1 2 1
0 1 1 0 2 2 1 1 1 1
0 1 1 1 1 1 2 1 2 2
1 1 2 1 1 1 1 1 2 2
1 1 1 1 1 2 2 1 2 2
1 2 0 1 1 2 1 2 1 2
0 2 2 0 1 1 1 1 1 1
0 1 1 0 0 1 2 2 1 0
0 1 1 1 1 1 1 1 1 0
")
image(1:ncol(Map1), 1:nrow(Map1), t(sapply(Map1, rev)),
zlim = c(0, length(cols) - 1), # This will spread you numbers properly
col = cols, xaxt='n', yaxt='n', ann=FALSE, bty='n', asp = 1)
Run Code Online (Sandbox Code Playgroud)
cols <- c("#FFFFFF", "#9AFC7F", "#77F255", "#60DF3D", "#49C925", "#37B215", "#219900")
set.seed(123)
d <- as.data.frame(matrix(sample(c(0, 1, 5, 6), 20, replace = TRUE), ncol = 4))
image(1:ncol(d), 1:nrow(d), t(sapply(d, rev)),
zlim = c(0, length(cols) - 1),
col = cols, xaxt='n', yaxt='n', ann=FALSE, bty='n', asp = 1)
cols) 不需要名称。订单足够了。zlim = c(1, length(cols))。apply(Map1, 2, rev)了sapply(Map1, rev)。1:ncol()和1:nrow(),因为原来的订单不适用于矩形桌子。