在matplotlib中绘制三维散点图

时间:2011-03-30 18:05:52

标签: python numpy matplotlib scipy data-visualization

我有一个scipy / numpy的Nx3矩阵集合,我想对它进行三维散射,其中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 =“”,也不会出现图例调用。如何才能显示图例?

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:15)

尝试用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是否包含这个最新更新,因为我仍在使用Matplotlib 1.0.0运行Python 2.6。

修改

传奇的快速而肮脏的虚拟情节,同时保持散射的3D透明效果:

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

答案 1 :(得分:4)

AFAIK,不直接支持3D散点图艺术家的传说。看这里: http://matplotlib.sourceforge.net/users/legend_guide.html#plotting-guide-legend

但是,您可以使用“代理艺术家”进行黑客攻击/解决方案,使用以下内容:

p = Rectangle((0, 0), 1, 1, fc="r")
axis.legend([p], ["Red Rectangle"])

因此代理艺术家不会被添加到轴上,但您可以使用它来创建图例。

答案 2 :(得分:0)

设置kwarg depthshade = False为我修复了它:

ax.scatter(np.log2(data[:, 0]), np.log2(data[:, 1]), 
               np.log2(data[:, 2]), 'o', c=curr_color,  label=my_labels[index], depthshade=False)