散点图中的各个alpha值

61 投票
2 回答
60174 浏览
提问于 2025-04-18 13:27

我在想,能不能给每个要绘制的点设置不同的透明度(alpha值),使用的是Matplotlib的scatter函数。我需要绘制一组点,每个点都有自己的透明度。

比如,我有这段代码来绘制一些点:

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参数。我该怎么给每个点设置不同的透明度呢?我可以一个一个循环绘制每个点,并为每个点指定透明度,但这样做似乎不是个好办法。

2 个回答

4

你可以使用颜色参数和一个带透明度的颜色映射。cmap 会让透明度的值从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()
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()

输出结果

撰写回答