我有一个scipy/numpy中的n x 3矩阵集合,我想对它进行三维散点,其中x和y轴由矩阵的第一列和第二列的值决定,每个条的高度是矩阵的第三列,条的数量由n决定。
每个矩阵代表一个不同的数据组,我希望用不同的颜色绘制每个矩阵,然后为整个图形设置一个图例。
我有以下代码:

fig = pylab.figure()
s = plt.subplot(1, 1, 1)
colors = ['k', "#B3C95A", 'b', '#63B8FF', 'g', "#FF3300",
          'r', 'k']
ax = Axes3D(fig)
plots = []
index = 0

for data, curr_color in zip(datasets, colors):
    p = ax.scatter(log2(data[:, 0]), log2(data[:, 1]),
                   log2(data[:, 2]), c=curr_color, label=my_labels[index])

    s.legend()
    index += 1

    plots.append(p)

    ax.set_zlim3d([-1, 9])
    ax.set_ylim3d([-1, 9])
    ax.set_xlim3d([-1, 9])

问题是ax.scatter绘制的东西是透明的,我希望删除它。另外,我想设置Xticks、Yticks和Zticks——我该怎么做?
最后,图例调用不会出现,即使我对每个散点调用都调用label=“”。我怎样才能让这个传说出现?
非常感谢你的帮助。

最佳答案

尝试用ax.plot替换“ax.scatter”,可能用“o”参数来获取类似的圆。这修复了透明度和图例。

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

mpl.rcParams['legend.fontsize'] = 10

fig = plt.figure(1)
fig.clf()
ax = Axes3D(fig)
datasets = random((8,100,3))*512
my_labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

colors = ['k', "#B3C95A", 'b', '#63B8FF', 'g', "#FF3300",
          'r', 'k']
index = 0
for data, curr_color in zip(datasets, colors):
    ax.plot(np.log2(data[:, 0]), np.log2(data[:, 1]),
                   np.log2(data[:, 2]), 'o', c=curr_color, label=my_labels[index])
    index += 1

ax.set_zlim3d([-1, 9])
ax.set_ylim3d([-1, 9])
ax.set_xlim3d([-1, 9])

ax.set_xticks(range(0,11))
ax.set_yticks([1,2,8])
ax.set_zticks(np.arange(0,9,.5))

ax.legend(loc = 'upper left')

plt.draw()

plt.show()

我添加了一些行和调整,以获得一些示例数据,并使您的演示的其余部分正常工作。我想你能让它工作。
设置刻度需要2010年8月对mplot3d进行更新,如here所述。我从Sourceforge获得了最新的mplot3d。我不太确定matplotlib 1.0.1是否包含这个最新的更新,因为我仍然在用matplotlib1.0.0运行python 2.6。
编辑
一个快速而肮脏的图例虚拟绘图,同时保持您从散射中获得的三维透明度效果:
index = 0
for data, curr_color in zip(datasets, colors):
    ax.scatter(np.log2(data[:, 0]), np.log2(data[:, 1]),
                   np.log2(data[:, 2]), 'o', c=curr_color, label=my_labels[index])
    ax.plot([], [], 'o', c = curr_color, label=my_labels[index])
    index += 1

09-07 11:49