【问题标题】:Correctly Converting Numbers to Colors in R (in Matrices or Otherwise)在 R 中正确地将数字转换为颜色(在矩阵或其他方面)
【发布时间】:2016-07-24 22:28:22
【问题描述】:

我正在将数字矩阵转换为颜色矩阵;但是,颜色显示不正确,例如,颜色矩阵显示的颜色相对于数字矩阵中分配的数字不正确。

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

cols <- c(
'0' = "#FFFFFF",
'1' = "#9AFC7F",
'2' = "#77F255",
'3' = "#60DF3D",
'4' = "#49C925",
'5' = "#37B215",
'6' = "#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
")

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
")

绘制矩阵后,我发现颜色与应分配的值不匹配。

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)

我一直难以弄清楚为什么数字和颜色不对齐。绘制分配给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)

第一个数字矩阵中没有任何6 值,因此第一个颜色矩阵中不应有任何黑色方块。似乎2 的值在第一个矩阵中被赋予了分配给6 的颜色,在第二个矩阵中被赋予了36 的颜色。

3 添加到第一个数字矩阵中似乎会将其他值向下移动色阶,即矩阵中的最大数字被分配最暗的颜色,而不是在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)

生成这两个颜色矩阵的数字矩阵之间的唯一区别是第一列中的0,第三行更改为3

【问题讨论】:

  • 问得好,但是 (1) 您能否提供数据,为我们提供 reproducible example ? (2) 你应该知道代码 sn-ps 对 R 代码没有任何用处 - 最好只对代码块使用缩进
  • 重现问题所需的所有数据都应该在问题中。唯一的数据是数字矩阵,我使用的唯一代码在此处的页面上。
  • 数字矩阵不是一种特别方便的格式来重现......(另外,更小的矩阵会更容易用于重现问题吗?)

标签: r matrix


【解决方案1】:

我认为您在将数字映射到字符时遇到问题。如果x 是数字,那么cols[x] 将按数字引用向量,而不是按名称...

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

cols <- c('0' = "#FF0000",'1' = "#9AFC7F",'2' = "#77F255",'3' = "#60DF3D",
    '4' = "#49C925",'5' = "#37B215",'6' = "#219900")

检查颜色定义:

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))

m <- matrix(0:5,ncol=2)
image(m,col=cols[m])  ## index by number 

现在按名称索引:

image(m,col=cols[as.character(m)])

【讨论】:

  • 我很难成功地将此解决方案应用于我的问题;然而,在我的尝试中——并且在编辑了原始问题以使其更具重现性和简洁性之后——我发现问题似乎是颜色矩阵将数字矩阵中的最大值分配给最暗的颜色,而不是值在cols。为了清楚起见,我在原始问题的底部添加了详细信息和新图片。
  • 如果您认为自己已经解决了自己的问题,请继续发布解决方案作为答案(只要您允许)
  • 我还没有解决这个问题;我对原始问题的补充是我以前没有注意到的一个错误,这可能对解决我遇到的问题很有价值。我仍然无法解决问题。
【解决方案2】:

正如您所指出的,问题在于颜色是由矩阵中的值决定的。这是因为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)

这是另一个例子:

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) 不需要名称。订单充足。
  • 如果使用从 1 而不是 0 开始的数据,请设置为 zlim = c(1, length(cols))
  • 我将apply(Map1, 2, rev) 缩短为sapply(Map1, rev)
  • 我交换了1:ncol()1:nrow(),因为原来的订单不适用于长方形桌子。

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多