如何使用 matplotlibs 颜色图 alpha 值使 tripcolor 图淡化为透明?
How do I use matplotlibs colormap alpha-values to make tripcolor plot fade to transparency?
我想使用 tripcolor 在地图上绘制概率分布,并希望分布在概率为 low/zero 的位置淡入透明。但是 tripcolor 似乎不接受颜色图提供的本地 alpha 值。
我设置了一个自定义颜色映射,从透明 (alpha=0.
) 白色过渡到一些蓝色 (alpha=1.
),如 matplotlib docs.[=18= 中所述]
cdict = {'red': ((0., 1., 1.),
(1., 0., 0.)),
'green': ((0., 1., 1.),
(1., 0.5, 0.5)),
'blue': ((0., 1., 1.),
(1., 1., 1.)),
'alpha': ((0., 0., 0.),
(1., 1., 1.))}
testcmap = colors.LinearSegmentedColormap('test', cdict)
plt.register_cmap(cmap=testcmap)
如果我将其应用到一条线上,如所述here
一切正常。
但是,如果我想使用 tripcolor 来绘制分布,它似乎忽略了颜色映射 alpha 值...
它适用于散点图。
可以在下面找到一个最小的工作示例。
import numpy as np
from matplotlib import pyplot as plt, colors, cm
# quick and dirty test data
ext = np.linspace(0., 1., 21)
coords, _ = np.meshgrid(ext, ext)
x = coords.flatten()
y = coords.T.flatten()
vals = 1. - np.sin(coords * np.pi / 2).flatten()
# color dict
cdict = {'red': ((0., 1., 1.),
(1., 0., 0.)),
'green': ((0., 1., 1.),
(1., 0.5, 0.5)),
'blue': ((0., 1., 1.),
(1., 1., 1.)),
'alpha': ((0., 0., 0.),
(1., 1., 1.))}
# colormap from dict
testcmap = colors.LinearSegmentedColormap('test', cdict)
plt.register_cmap(cmap=testcmap)
# plotting
fig, ax = plt.subplots(1)
ax.set_facecolor('black')
ax.tripcolor(x, y, vals, cmap='test')
fig2, ax2 = plt.subplots(1)
ax2.set_facecolor('black')
ax2.scatter(x, y, c=vals, cmap='test')
plt.show()
编辑:
查看 sourcecode line 118 似乎为三角剖分设置了一个全局 alpha。 Copy/pasting tripcolor 函数并省略此行有效。然而,使用 matplotlibs 内置函数仍然很好......
编辑2:
将数据生成函数从 cos 更改为 1-sin 以获得更具启发性的转换。
对于第一个给出好的结果的编辑,我也不得不使用 shading='gouraud'
.
这是否更接近您要查找的内容?
ax.tripcolor(x, y, vals, cmap='test', alpha=None)
不知道为什么,但我的猜测是设置 alpha=None
允许每个三角形从颜色图中获取 alpha 颜色。
我想使用 tripcolor 在地图上绘制概率分布,并希望分布在概率为 low/zero 的位置淡入透明。但是 tripcolor 似乎不接受颜色图提供的本地 alpha 值。
我设置了一个自定义颜色映射,从透明 (alpha=0.
) 白色过渡到一些蓝色 (alpha=1.
),如 matplotlib docs.[=18= 中所述]
cdict = {'red': ((0., 1., 1.),
(1., 0., 0.)),
'green': ((0., 1., 1.),
(1., 0.5, 0.5)),
'blue': ((0., 1., 1.),
(1., 1., 1.)),
'alpha': ((0., 0., 0.),
(1., 1., 1.))}
testcmap = colors.LinearSegmentedColormap('test', cdict)
plt.register_cmap(cmap=testcmap)
如果我将其应用到一条线上,如所述here 一切正常。
但是,如果我想使用 tripcolor 来绘制分布,它似乎忽略了颜色映射 alpha 值...
它适用于散点图。
可以在下面找到一个最小的工作示例。
import numpy as np
from matplotlib import pyplot as plt, colors, cm
# quick and dirty test data
ext = np.linspace(0., 1., 21)
coords, _ = np.meshgrid(ext, ext)
x = coords.flatten()
y = coords.T.flatten()
vals = 1. - np.sin(coords * np.pi / 2).flatten()
# color dict
cdict = {'red': ((0., 1., 1.),
(1., 0., 0.)),
'green': ((0., 1., 1.),
(1., 0.5, 0.5)),
'blue': ((0., 1., 1.),
(1., 1., 1.)),
'alpha': ((0., 0., 0.),
(1., 1., 1.))}
# colormap from dict
testcmap = colors.LinearSegmentedColormap('test', cdict)
plt.register_cmap(cmap=testcmap)
# plotting
fig, ax = plt.subplots(1)
ax.set_facecolor('black')
ax.tripcolor(x, y, vals, cmap='test')
fig2, ax2 = plt.subplots(1)
ax2.set_facecolor('black')
ax2.scatter(x, y, c=vals, cmap='test')
plt.show()
编辑: 查看 sourcecode line 118 似乎为三角剖分设置了一个全局 alpha。 Copy/pasting tripcolor 函数并省略此行有效。然而,使用 matplotlibs 内置函数仍然很好......
编辑2:
将数据生成函数从 cos 更改为 1-sin 以获得更具启发性的转换。
对于第一个给出好的结果的编辑,我也不得不使用 shading='gouraud'
.
这是否更接近您要查找的内容?
ax.tripcolor(x, y, vals, cmap='test', alpha=None)
不知道为什么,但我的猜测是设置 alpha=None
允许每个三角形从颜色图中获取 alpha 颜色。