使用Python和matplotlib控制3D散点图的alpha值

20 投票
3 回答
11205 浏览
提问于 2025-04-17 19:47

我正在使用scatter和mplot3d函数绘制一个3D散点图。我为图中的所有点选择了一个统一的颜色,但在matplotlib绘制时,点的透明度会根据与相机的距离而变化。有没有办法关闭这个功能?

我尝试将alpha参数设置为None或1,还把vmin/vmax设置为1(想强制颜色保持为一个固定的颜色),但都没有成功。在scatter的文档中,我没有看到其他可能与这个设置相关的选项。

谢谢!

3 个回答

6

如果你只是想关闭透明度的调整,可以重写zalpha这个函数。这样的话,在进行交互式图表时,你仍然可以更新颜色,同时去掉深度雾效。

from mpl_toolkits.mplot3d import *
import numpy as np
import matplotlib.pyplot as plt
plt.ion()

art3d.zalpha = lambda *args:args[0]

fig = plt.figure()
ax = fig.gca(projection='3d')

x = np.random.sample(20)
y = np.random.sample(20)
z = np.random.sample(20)
s = ax.scatter(x, y, z, c="r")

ax.legend()
ax.set_xlim3d(0, 1)
ax.set_ylim3d(0, 1)
ax.set_zlim3d(0, 1)

plt.show()
13

在编程中,有时候我们需要把一些东西放到一个地方,然后再从这个地方拿出来。这个过程就像把书放到书架上,然后再去找这本书。

在这个例子里,我们用一个叫做“栈”的结构来实现这个过程。栈就像一个盘子,最上面的一层是我们最后放上去的东西。当我们要拿东西的时候,只能从最上面开始拿,这就叫做“后进先出”。

所以,如果你先放了三个东西,想要拿第一个,就必须先把上面的两个拿掉。这种方式在编程中很常见,特别是在处理一些临时数据时。

希望这个解释能帮助你理解栈的基本概念!

ax.scatter(x, y, z, depthshade=0)
17

对于Matplotlib 1.4及以上版本,@fraxel提供的解决方案是最好的:调用 ax.scatter 并设置参数 depthshade=False

没有其他参数可以控制这个问题。这里有一种变通的方法。

可以禁用 set_edgecolorsset_facecolors 方法,这样 mplot3d 就无法更新颜色的透明度部分:

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca(projection='3d')

x = np.random.sample(20)
y = np.random.sample(20)
z = np.random.sample(20)
s = ax.scatter(x, y, z, c="r")
s.set_edgecolors = s.set_facecolors = lambda *args:None

ax.legend()
ax.set_xlim3d(0, 1)
ax.set_ylim3d(0, 1)
ax.set_zlim3d(0, 1)

plt.show()

在这里输入图片描述

如果你想在之后调用 set_edgecolorsset_facecolors 方法,可以在禁用它们之前先备份这两个方法:

s._set_facecolors, s._set_edgecolors = s.set_facecolors, s.set_edgecolors

撰写回答