基于三个变量进行颜色处理- 麦克斯韦三角形

4
我有一个由三个变量u、v、w组成的模型,它们随时间和空间的变化而变化。我特别关注这三个变量的比率。但是,我不想显示三个图表,每个图表一个变量,我更愿意只使用一个图表。
我的想法是使用麦克斯韦三角形(彩色三角形,请参见http://homepages.abdn.ac.uk/npmuseum/article/Maxwell/MaxTri.html)。我可以很容易地将每个变量缩放到其最大值为1。但我不知道这个想法是否可行。如果有意义,应该已经存在。
我的问题:
1. 如何将三个变量转换为代表颜色的单个值(例如,如果我有一个填充轮廓图,我希望每个网格单元格都有“它的比率”)? 2. 我可以将彩色三角形用作颜色条吗?
我试图举一个简短的例子来使其更容易理解:
import numpy as np
import matplotlib.pyplot as plt
# create three arrays for the state variables
# space is a 200x200 grid
size = 200
u = np.random.rand(size,size)
v = np.random.rand(size,size)
w = np.random.rand(size,size)
# now I could create 3 subplots and plot the spatial distribution
# for each variable
# but I want something like
col = np.zeros((200,200))
for i in range(200): # loop in x-direction
    for j in range(200): # loop in y-direction
        col[i,j] = colorTriangle(u[i,j],v[i,j],w[i,j])
plt.contourf(col)

函数colorTriangle不存在。但我想要类似这样的东西:如果每个变量在(i,j)处具有相同的值,则颜色应为白色(参见麦克斯韦三角形)。如果只有u,则应为绿色。如果只有v,则应为红色。如果只有w,则应为蓝色。
如果组合更复杂,则每个变量应“拉”一个颜色方向,并根据在麦克斯韦三角形中的位置选择颜色。

你明白了吗?它不一定是一个颜色三角形,但我希望在一个contourf图中有这种信息。而颜色三角形将有助于解释颜色。


1
如果您发布一个示例(如有疑问,请参见https://stackoverflow.com/help/mcve),那将非常有用。我不太理解您的目标,因为您有3个变量,因此,如果您绘制轮廓图,一个轴将是u,另一个轴将是v,轮廓线/颜色将是w。麦克斯韦三角形从哪里进入? - OriolAbril
我添加了信息。我没有提到系统是空间显式的 - 对此我很抱歉。希望这有所帮助?! - gumpel
1个回答

3
回答第一个问题,有许多需要注意的事项。
首先,表示颜色的唯一方法是使用颜色映射表,它将标量映射到颜色。然而,Maxwell三角形不能被简化为单个值。
这并不意味着Maxwell三角不能用作一种3D颜色映射,将3个值映射到一种颜色中。实际上,这非常自然,因为Maxwell使用3个值a,b和c,使得颜色可以表示为RGB坐标中的(a,b,c)。唯一缺少的是归一化。
在提供的链接中,Maxwell三角形被定义为a+b+c=1。然而,matplotlib将RGB坐标接受为介于0和1之间的3个浮点数,其中白色显然为1,1,1,而不是1/3,1/3,1/3。因此,每个i,j都将有三个值,这些值必须考虑到这一点转换为介于0和1之间的3个浮点数。
因此,我们不能通过将总和除以(得到 a+b+c=1)来进行标准化,而是必须通过将每个三元组的最大值除以来进行标准化。
最终,可以使用 imshow 显示生成的图像。
def colorTriangle(r,g,b):
    image = np.stack([r,g,b],axis=2)
    return image/image.max(axis=2)[:,:,None]

size = 200
X,Y = np.meshgrid(np.linspace(0,1,200),np.linspace(0,1,200))
u = np.full_like(X,.2)
v = Y
w = X**2
plt.imshow(colorTriangle(v,u,w),origin='lower',extent=(0,1,0,1)) 
# Note that v is first in order to be represented by red

输出图像如下:

color triangle

在这里可以清楚地看到,对于小的x和y值,其中vw为零,颜色是绿色的,因为u不等于零且比vw大得多。对于大的x和小的y,w占主导地位,颜色确实是蓝色的,当v占主导地位(大的y和小的x),颜色是红色的。还显示了对于所有三个矩阵相等的值,结果颜色为白色。


非常感谢。这正是我一直在寻找的。 - gumpel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接