正确地将数字转换为R中的颜色(矩阵或其他)

Cam*_*ron 6 r matrix

我正在将数字矩阵转换为颜色矩阵; 然而,颜色没有正确显示,例如,颜色矩阵显示相对于数字矩阵中指定数字的不正确颜色.

我首先将颜色分配给一组数值.

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)

地图1

地图2

我一直难以理解为什么数字和颜色没有对齐.绘制分配的数字以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在所述第一矩阵,并且36在所述第二.

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)

包含<code>0</code>在第一列中,第三行被更改为a <code>3</code>.</p></p>
    </div>
  </div>

<div class=

Ben*_*ker 6

我认为你在将数字映射到字符方面存在问题.如果x是数字,那么cols[x]将按编号引用矢量,而不是按名称引用...

我将第一种颜色改为红色(而不是白色),使值更加明显.

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)])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Sim*_*son 3

正如您所指出的,问题在于颜色是由矩阵中的值决定的。这是因为image()矩阵中的值会自动分布到所提供的颜色范围内。要按照您的预期传播它们,您需要设置参数zlim以覆盖向量的长度。请查看帮助页面 ( ?image) 了解更多详细信息。

因此,要纠正图像,您可以执行以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

一些旁注:

  • 颜色向量 ( cols) 不需要名称。订单足够了。
  • 如果使用从 1 而不是 0 开始的数据,请设置为zlim = c(1, length(cols))
  • 我用 缩短apply(Map1, 2, rev)sapply(Map1, rev)
  • 我交换了1:ncol()1:nrow(),因为原来的订单不适用于矩形桌子。