根据3个变量的颜色 - 麦克斯韦三角

时间:2018-06-14 14:01:13

标签: python matplotlib colors colorbar

我有一个由三个变量u,v,w组成的模型,它们随时间和空间而变化。我对这三个变量的比例特别感兴趣。 但是,我不想显示三个图,每个图一个变量,我宁愿只使用一个图。

我的想法是使用麦克斯韦三角形(颜色三角形,见http://homepages.abdn.ac.uk/npmuseum/article/Maxwell/MaxTri.html)。 我可以轻松地扩展其最大值为1的每个变量。但我不知道这个想法是否可实现。如果它有意义,它应该已经存在。 我的问题:

  1. 如何将三个变量转换为表示颜色的单个值(例如,如果我有一个填充的等高线图,我希望每个网格单元都有“其比率”)?
  2. 我可以将颜色三角形用作颜色条吗?
  3. 我尝试举一个简短的例子,让它更容易理解:

    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)处具有相同的值,则颜色应为白色(参见Maxwell三角形)。如果我们只有你,它应该是绿色的。如果我们只有v,它应该是红色的。如果我们只有w,它应该是蓝色的 如果组合更复杂,则每个变量应在一个颜色方向上“拉”,并且应根据麦克斯韦三角形中的位置选择颜色。

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

1 个答案:

答案 0 :(得分:1)

要回答第一个问题,有许多事情需要注意。

首先,单个值可以表示颜色的唯一方法是使用色标图,它将标量映射到颜色。但是,麦克斯韦三角形不能简化为单个值。

这并不意味着麦克斯韦三角形不能用作一种3D色彩图,将3个值映射到一种颜色。实际上这很自然,因为Maxwell使用3个值abc,因此颜色可以用RGB坐标表示为(a,b,c)。唯一缺少的是规范化。

在提供的链接中,麦克斯韦三角形定义为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)时,颜色为红色。还表明,对于所有三个矩阵的相等值,得到的颜色是白色。

相关问题