将距离映射到颜色
Mapping distances to colors
假设多个样本之间的距离矩阵,我想以某种方式合理地将这些距离映射到颜色 space。因此,例如,如果您有三个明显的簇,它们应该具有不同的颜色,并且在一个簇内您将具有多种颜色深浅。但是,如果可能的话,我想避免显式聚类。
显然,映射不可能是完美和通用的:相反,它是一种启发式方法。
是否有已知的算法?或者,也许是 R 的现成解决方案?
这是一种可能。无论您的原始数据有多少维,您都可以使用距离矩阵的多维缩放将数据投影到三个维度,以一种粗略保留距离的方式。如果将三个维度视为 R、G 和 B,这将给出一个配色方案,其中接近的点应具有 "close" 颜色。
这是一个简单的例子。我生成了一些具有 4 个聚类的 5 维数据(尽管没有执行聚类分析)。由此,我们得到了距离矩阵。然后,如上所述,我们使用多维缩放将其转换为颜色图。绘制点以显示结果。
## Generate some sample data
set.seed(1234)
v = c(rnorm(80,0,1), rnorm(80,0,1), rnorm(80,4,1), rnorm(80,4,1))
w = c(rnorm(80,0,1), rnorm(80,4,1), rnorm(80,0,1), rnorm(80,4,1))
x = c(rnorm(80,0,1), rnorm(80,0,1), rnorm(80,4,1), rnorm(80,4,1))
y = c(rnorm(80,0,1), rnorm(80,4,1), rnorm(80,0,1), rnorm(80,4,1))
z = c(rnorm(80,0,1), rnorm(80,4,1), rnorm(80,-4,1), rnorm(80,8,1))
df = data.frame(v,w,x,y,z)
## Distance matrix
D = dist(df)
## Project to 3-dimensions
PROJ3 = cmdscale(D, 3)
## Scale the three dimensions to [0,1] interval
ScaledP3 = apply(PROJ3, 2, function(x) { (x - min(x))/(max(x)-min(x)) })
colnames(ScaledP3) = c("red", "green", "blue")
X = as.data.frame(ScaledP3)
## Convert to color map
ColorMap = do.call(rgb, X)
plot(x,y, pch=20, col=ColorMap)
假设多个样本之间的距离矩阵,我想以某种方式合理地将这些距离映射到颜色 space。因此,例如,如果您有三个明显的簇,它们应该具有不同的颜色,并且在一个簇内您将具有多种颜色深浅。但是,如果可能的话,我想避免显式聚类。
显然,映射不可能是完美和通用的:相反,它是一种启发式方法。
是否有已知的算法?或者,也许是 R 的现成解决方案?
这是一种可能。无论您的原始数据有多少维,您都可以使用距离矩阵的多维缩放将数据投影到三个维度,以一种粗略保留距离的方式。如果将三个维度视为 R、G 和 B,这将给出一个配色方案,其中接近的点应具有 "close" 颜色。
这是一个简单的例子。我生成了一些具有 4 个聚类的 5 维数据(尽管没有执行聚类分析)。由此,我们得到了距离矩阵。然后,如上所述,我们使用多维缩放将其转换为颜色图。绘制点以显示结果。
## Generate some sample data
set.seed(1234)
v = c(rnorm(80,0,1), rnorm(80,0,1), rnorm(80,4,1), rnorm(80,4,1))
w = c(rnorm(80,0,1), rnorm(80,4,1), rnorm(80,0,1), rnorm(80,4,1))
x = c(rnorm(80,0,1), rnorm(80,0,1), rnorm(80,4,1), rnorm(80,4,1))
y = c(rnorm(80,0,1), rnorm(80,4,1), rnorm(80,0,1), rnorm(80,4,1))
z = c(rnorm(80,0,1), rnorm(80,4,1), rnorm(80,-4,1), rnorm(80,8,1))
df = data.frame(v,w,x,y,z)
## Distance matrix
D = dist(df)
## Project to 3-dimensions
PROJ3 = cmdscale(D, 3)
## Scale the three dimensions to [0,1] interval
ScaledP3 = apply(PROJ3, 2, function(x) { (x - min(x))/(max(x)-min(x)) })
colnames(ScaledP3) = c("red", "green", "blue")
X = as.data.frame(ScaledP3)
## Convert to color map
ColorMap = do.call(rgb, X)
plot(x,y, pch=20, col=ColorMap)