散点图中的个体α值

61
我想知道是否可以使用Matplotlib的scatter函数为每个要绘制的点设置单独的alpha值。我需要绘制一组具有各自alpha值的点。
例如,我有这段代码来绘制一些点:
def plot_singularities(points_x, p, alpha_point, file_path):
    plt.figure()
    plt.scatter(points_x, points_y, alpha=alpha_point)
    plt.savefig(file_path + '.png', dpi=100)
    plt.close()

我所有的points_xpoints_yalpha_point都有n个值。然而,我无法将一个数组分配给scatter()中的alpha参数。我该如何为每个点设置不同的透明度值? 我可以通过循环遍历每个特定透明度值的点并逐个绘制,但这似乎不是一个好方法。


我希望它是一个散点图,其中某些点有标记。不是热力图。 - pceccon
3
为使它正常工作,你需要传入一个已经以RGBA值为预映射的颜色列表。 - tacaswell
2个回答

89

使用matplotlib >= 3.4的新解决方案

自从matplotlib 3.4版本以后,alpha参数支持一个包含多个值的可迭代对象: https://matplotlib.org/stable/users/prev_whats_new/whats_new_3.4.0.html#transparency-alpha-can-be-set-as-an-array-in-collections

import numpy as np
import matplotlib.pylab as plt

x = np.arange(10)
y = np.arange(10)

alphas = np.linspace(0.1, 1, 10)

plt.scatter(x, y, alpha=alphas)
plt.show()

matplotlib < 3.4 的旧解决方案

tcaswell的建议是正确的,您可以像这样操作:

import numpy as np
import matplotlib.pylab as plt

x = np.arange(10)
y = np.arange(10)

alphas = np.linspace(0.1, 1, 10)
rgba_colors = np.zeros((10,4))
# for red the first column needs to be one
rgba_colors[:,0] = 1.0
# the fourth column needs to be your alphas
rgba_colors[:, 3] = alphas

plt.scatter(x, y, color=rgba_colors)
plt.show()

输出


1
你是否知道为什么 plt.plot 不支持这个(或者它支持吗)? - jtlz2
1
plt.plot使用线段,参见https://matplotlib.org/gallery/lines_bars_and_markers/multicolored_line.html以获取多色线。如果您想设置标记颜色,请使用`markerfacecolor`和`markeredgecolor` kwargs。 - MaxNoe
3
很遗憾 alpha= 不支持可迭代的输入,因为它在使用 color= 时效果非常好。 - Guimoute
1
在 matplotlib 3.4 中,alpha 现在支持可迭代对象,每个数据点都有一个值。 - MaxNoe
我已经尝试使用matplotlib 3.4和3.5,但新的解决方案仍然无法正常工作! - Zany Brainy
显示剩余2条评论

4

您可以使用带有alpha的colormap和color参数。cmap会线性地将alpha值从0增加到1。

在这里输入图片描述

import numpy as np
import matplotlib.pylab as plt
from matplotlib import colors

c='C0'

xs = np.arange(10)

fig, ax = plt.subplots(1, 1)
cmap = colors.LinearSegmentedColormap.from_list(
        'incr_alpha', [(0, (*colors.to_rgb(c),0)), (1, c)])
ax.scatter(xs, xs, c=xs, cmap=cmap, ec=None, s=10**2)

plt.show()

谢谢你的回答。C0代表什么? - umn
1
'C0'是蓝色的一种色调。'C0'到'C9'是Matplotlib标准颜色板。它们在具有许多线条的图中可以很好地区分开来。 - Markus Dutschke
2
C0 - C9 不是 matplotlib 的“标准”颜色板,它们是“当前”调色板。如果您使用另一种样式,则这些颜色的含义会发生变化。因此,C0 不一定是蓝色的阴影,它是当前调色板的第一种颜色,在默认情况下是蓝色,但原则上可以是任何颜色。 - MaxNoe

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