странное поведение с 3D-гистограммой в Matplotlib в Python - PullRequest
1 голос
/ 30 марта 2011

У меня есть матрица Nx3 в scipy / numpy, и я хотел бы сделать из нее трехмерную гистограмму, где оси X и Y определяются значениями первого и второго столбцов матрицы, высотойкаждого столбца является третьим столбцом в матрице, и количество столбцов определяется по N.

Кроме того, я хочу построить несколько групп этих матриц, каждая из которых имеет свой цвет («сгруппированный» 3Dгистограмма.)

Когда я пытаюсь построить его следующим образом:

ax.bar(data[:, 0], data[:, 1], zs=data[:, 2],
               zdir='z', alpha=0.8, color=curr_color)

Я получаю очень странные бары - как видно здесь: http://tinypic.com/r/anknzk/7

Любая идеяпочему стержни такие кривые и странной формы?Я просто хочу один столбец в точке XY, высота которого равна точке Z.

1 Ответ

2 голосов
/ 30 марта 2011

Вы неправильно используете ключевое слово аргумент zs.Он относится к плоскостям, на которых размещен каждый набор стержней (определенный вдоль оси zdir).Они изогнуты, потому что это предполагает, что набор баров, определенных вызовом ax.bar, находится в одной плоскости.Вам, вероятно, лучше звонить ax.bar несколько раз (по одному на каждый самолет).Следуйте этому примеру внимательно.Вам нужно, чтобы zdir было 'x' или 'y'.

Редактировать

Вот полный код (в значительной степени основанный на приведенном выше примере).

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# this is just some setup to get the data
r = numpy.arange(5)
x1,y1 = numpy.meshgrid(r,r)
z1 = numpy.random.random(x1.shape)

# this is what your data probably looks like (1D arrays):
x,y,z = (a.flatten() for a in (x1,y1,z1))
# preferrably you would have it in the 2D array format
# but if the 1D is what you must work with:
# x is: array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4,
#              0, 1, 2, 3, 4, 0, 1, 2, 3, 4,
#              0, 1, 2, 3, 4])
# y is: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
#              2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
#              4, 4, 4, 4, 4])

for i in range(0,25,5):
    # iterate over layers
    # (groups of same y)
    xs = x[i:i+5] # slice each layer
    ys = y[i:i+5]
    zs = z[i:i+5]
    layer = ys[0] # since in this case they are all equal.
    cs = numpy.random.random(3) # let's pick a random color for each layer
    ax.bar(xs, zs, zs=layer, zdir='y', color=cs, alpha=0.8)

plt.show()
...