Подтвердить что ты не робот

Управление значением альфа на 3D-графике с использованием Python и matplotlib

Я рисую график 3D-рассеяния, используя функцию разброса и mplot3d. Я выбираю один цвет для всех точек графика, но при рисовании matplotlib прозрачность точек устанавливается относительно расстояния от камеры. Есть ли способ отключить эту функцию?

Я попытался установить альфа-kwarg в None/1, а также установить vmin/vmax в 1 (в попытке заставить масштабирование цвета быть сплошным одиночным цветом) без везения. Я не видел никаких других возможных вариантов, связанных с этим параметром в документации по разбросу.

Спасибо!

4b9b3361

Ответ 1

Нет аргументов, которые могли бы контролировать это. Вот несколько способов взлома.

Отключить метод set_edgecolors и set_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()

enter image description here

Если вы хотите использовать методы set_edgecolors и set_facecolors позже, вы можете сделать резервную копию этих двух методов перед их отключением:

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

Ответ 2

Если вы хотите отключить альфа-настройку, вы можете перезаписать функцию 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()

Ответ 3

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