matplotlib 3: трехмерные точечные диаграммы с - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть некоторый код, который создает трехмерную диаграмму рассеяния, используя scatter в matplotlib в сочетании с tight_layout, см. Упрощенный код ниже:

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

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

N = 100
x = np.random.random(N)
y = np.random.random(N)
z = np.random.random(N)

ax.scatter(x, y, z)
plt.tight_layout()  # <-- Without this, everything is fine
plt.savefig('scatter.png')

В matplotlib 2.2.3 это выглядит какитак: enter image description here

Аналогичные выходные данные генерируются более старыми версиями, по крайней мере, до версии 1.5.1.При использовании новой версии 3.0.0 что-то идет не так в plt.tight_layout(), и я получаю следующий вывод: enter image description here

Сопровождающее это предупреждение

... / matplotlib / inj_layout.py: 177: UserWarning: Левые и правые поля нельзя сделать достаточно большими, чтобы вместить все декорации осей

Можно утверждать, что использование tight_layout безАргументы, приведенные здесь, не всегда (на старых matplotlibs) постоянно приводят к ожидаемым ужесточенным полям, и поэтому следует воздерживаться от использования tight_layout с 3D-графиками.Однако ручная настройка аргументов на tight_layout это (раньше) достойный способ обрезать поля даже на трехмерных графиках.

Я предполагаю, что это ошибка в matplotlib, но, возможно, ониЯ сделал некоторые преднамеренные изменения, которые я не заметил.Любые указатели о исправлении приветствуются.

1 Ответ

0 голосов
/ 25 сентября 2018

Благодаря комментарию ImportanceOfBeingErnest он теперь работает:

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

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

N = 100
x = np.random.random(N)
y = np.random.random(N)
z = np.random.random(N)

ax.scatter(x, y, z)

# The fix
for spine in ax.spines.values():
    spine.set_visible(False)

plt.tight_layout()

plt.savefig('scatter.png')

По ссылкам в комментарии кажется, что это будет исправлено в matplotlib 3.0.x.На данный момент, выше может быть использовано.

...