2013-12-10 186 views
3

我想創建一個三維散點圖,其中包含同一圖表中的不同數據集以及帶有標籤的圖例。我面臨的問題是我無法正確地添加圖例,並且我得到一個帶有空標籤的圖,如http://tinypic.com/view.php?pic=4jnm83&s=5#.Uqd-05GP-gQ中的圖。更具體地說,我得到錯誤: 「warnings.warn(」Legend不支持%s \ n使用代理藝術家。\ n \ nhttp://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-藝術家\ n「%(str(orig_handle),)) /usr/lib/pymodules/python2.7/matplotlib/legend.py:610:UserWarning:Legend不支持 改用代理藝術家。」在Matplotlib中使用scatter()在3D散點圖中添加圖例

請從下面的是我迄今爲止嘗試過的實例演示:

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
import random 
import csv 
from os import listdir 
from os.path import isfile, join 

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

handles = [] 
colors = ['blue', 'red'] 

X1 = range(0,10) 
Y1 = range(0,10) 
Z1 = range(0,10) 

random.shuffle(X1) 
random.shuffle(Y1) 
random.shuffle(Z1) 

scatter1 = ax.scatter(X1, Y1, Z1, c = colors[0], marker = 'o') 

random.shuffle(X1) 
random.shuffle(Y1) 
random.shuffle(Z1) 

scatter2 = ax.scatter(X1, Y1, Z1, c = colors[1], marker = 'v') 

ax.set_xlabel('X', fontsize = 10) 
ax.set_ylabel('Y', fontsize = 10) 
ax.set_zlabel('Z', fontsize = 10) 

ax.legend([scatter1, scatter2], ['label1', 'label2']) 

plt.show() 

我見過其他大致類似的例子,但他們沒有使用散射()的情節。除了一個工作解決方案,有人可以解釋我做錯了什麼嗎?

+0

你看看有關代理的藝術家的錯誤味精指定的鏈接繪製的線? – M4rtini

+0

是的,但由於我是python新手,所以不清楚錯誤的原因。 – Dio

回答

13
scatter1_proxy = matplotlib.lines.Line2D([0],[0], linestyle="none", c=colors[0], marker = 'o') 
scatter2_proxy = matplotlib.lines.Line2D([0],[0], linestyle="none", c=colors[1], marker = 'v') 
ax.legend([scatter1_proxy, scatter2_proxy], ['label1', 'label2'], numpoints = 1) 

問題是圖例函數不支持由3D散點圖返回的類型。所以你必須創建一個具有相同特徵的「虛擬情節」,並將它們放在圖例中。

爲NumPoints = 1只得到一個點在傳說中
線型=「無」那麼有沒有傳說中的