<p>因此,为了重申这个问题以确保我正确理解它:您希望有两个不同的colormap通道,而不是一个</p>
<p>在matplotlib中,我看不到直接的方法,有两个选项:</p>
<ul>
<li>使用不同的颜色通道/颜色贴图/透明胶片多次打印相同的数据</li>
<li>定义自己的自定义2D到RGB颜色贴图,并将RGB三元组数组传递给plotting函数</li>
</ul>
<p>对于“hack-y”多重打印解决方案:</p>
<pre><code>import numpy as np
from matplotlib.colors import hsv_to_rgb, rgb_to_hsv
import matplotlib.pyplot as plt
xydata = np.array([(x,y) for x in np.arange(-1.,1.1,0.1) for y in np.arange(-1.,1.1,0.1)], dtype=float)
x_colorfunc = lambda xy: xy.T[0].max() - np.abs(xy.T[0])
y_colorfunc = lambda xy: np.abs(xy.T[1])
y_colormap_coord = y_colorfunc(xydata)
x_colormap_coord = x_colorfunc(xydata)
x_colormap = "plasma"
y_colormap = "Greys"
plt.figure("2d_colormap_hack")
plt.scatter(xydata.T[0], xydata.T[1], c=x_colormap_coord, cmap= x_colormap, alpha=1.0)
plt.scatter(xydata.T[0], xydata.T[1], c=y_colormap_coord, cmap= y_colormap, alpha=0.6)
</code></pre>
<p>产生</p>
<p><a href="https://i.stack.imgur.com/Iwans.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Iwans.png" alt="2-channel hack graph"/></a></p>
<p>您可以对自定义2D到颜色功能执行任何操作,但这里有两个建议:</p>
<pre><code>def xy_color_func(xy):
# using np.divide handles `RuntimeWarning: divide by zero encountered in true_divide`
xy_ratio = np.divide(xy.T[1], xy.T[0], out=np.ones_like(xy.T[0]), where=(xy.T[0]!=0) )
xy_angle_frac = (4/np.pi)*np.abs(np.arctan(xy_ratio))
xy_mag = np.linalg.norm(xy, axis=-1)
hsl_hue = 1 - 1./6*xy_angle_frac # hue goes from red to blue
hsl_sat = 1 - xy_mag/xy_mag.max() # 0 is full color saturation, 1 is equal RGB values
hsl_luminance = 0.75 - 0.25*(xy_mag/xy_mag.max()) # brighter at the "target" point of (0, 0)
hsv = hsl_to_hsv(hsl_hue, hsl_sat, hsl_luminance)
rgb = hsv_to_rgb(hsv)
return rgb
def hsl_to_hsv(hsl_hue, hsl_sat, hsl_luminance):
hsv_hue = hsl_hue
hsv_v = hsl_luminance + hsl_sat*np.minimum(hsl_luminance, 1-hsl_luminance)
hsv_sat = 2*(1-np.divide(hsl_luminance, hsv_v, out=np.ones_like(hsv_v), where=(hsv_v!=0) ))
hsv = np.vstack((hsv_hue, hsv_sat, hsv_v)).T
return hsv
xy_colors = xy_color_func(xydata)
plt.figure("2d_colormap_func")
plt.scatter(xydata.T[0], xydata.T[1], c=xy_colors)
</code></pre>
<p>产生</p>
<p><a href="https://i.stack.imgur.com/29iSA.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/29iSA.png" alt="2D color function graph"/></a></p>
<p>看起来您所需的颜色贴图需要更多的规则来将XY区域转换为所需的颜色,并使用渐变/混合函数从一个区域过渡到另一个区域,类似于<a href="https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_RGB" rel="nofollow noreferrer">4</a>中所示的梯形混合。在你想要的地图上面</p>
<ul>
<li>“绿色”是<code>x<=0</code></li>
<li>“红色”是<code>x >0 & y < 0</code></li>
<li>“蓝色”是<code>x > 0 & y >= 0</code>,并且</li>
<li><code>white</code>是{<cd5>}</li>
</ul>
<p>实现这一点的一种方法可能是在图形程序(如Gimp或Inkscape)中创建具有所需颜色的点网格,调整关键坐标和指定的颜色三元组(RGB、HSL或HSV),直到您对外观满意,然后使用<code>scipy.interpolate.griddata</code><a href="https://en.wikipedia.org/wiki/HSL_and_HSV" rel="nofollow noreferrer">5</a>为XY数据插值3个颜色通道中的每一个,例如:</p>
<pre><code>key_xy_points = np.array([[0,0],[1,0],[1,1],[1,-1],[-1,1], [-1,-1]],dtype=float)
key_xy_RGBs = np.array([[1,1,1], [1,1,1], [0,0,1], [1,0,0], [0,1,0], [0,1,0]],dtype=float)
from scipy.interpolate import griddata
reds = griddata(key_xy_points, key_xy_RGBs.T[0], xydata)
greens = griddata(key_xy_points, key_xy_RGBs.T[1], xydata)
blues = griddata(key_xy_points, key_xy_RGBs.T[2], xydata)
xy_colors_griddata = np.vstack((reds, greens, blues)).T
plt.figure("2d_colormap_griddata")
plt.scatter(xydata.T[0], xydata.T[1], c=xy_colors_griddata)
</code></pre>
<p>产生</p>
<p><a href="https://i.stack.imgur.com/wHmWc.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/wHmWc.png" alt="2D color function graph from griddata"/></a></p>
<p>注意:只要我编写自己的颜色空间转换函数,我就可以直接从HSL转换为RGB<a href="https://en.wikipedia.org/wiki/HSL_and_HSV" rel="nofollow noreferrer">3</a>,但也许有一位评论员可以解释为什么matplotlib.colors有<code>hsv_to_rgb</code>而没有<code>hsl_to_rgb</code>(运行matplotlib v.3.3.2)</p>