2013-07-01 280 views
34

我創建了一個4D散點圖來表示特定區域的不同溫度。當我創建圖例時,圖例顯示正確的符號和顏色,但添加了一條線。我正在使用的代碼是:Matplotlib散點圖圖例

colors=['b', 'c', 'y', 'm', 'r'] 
lo = plt.Line2D(range(10), range(10), marker='x', color=colors[0]) 
ll = plt.Line2D(range(10), range(10), marker='o', color=colors[0]) 
l = plt.Line2D(range(10), range(10), marker='o',color=colors[1]) 
a = plt.Line2D(range(10), range(10), marker='o',color=colors[2]) 
h = plt.Line2D(range(10), range(10), marker='o',color=colors[3]) 
hh = plt.Line2D(range(10), range(10), marker='o',color=colors[4]) 
ho = plt.Line2D(range(10), range(10), marker='x', color=colors[4]) 
plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),numpoints=1, loc='lower left', ncol=3, fontsize=8) 

我試圖改變Line2DScatterscatterScatter返回一個錯誤,scatter改變了圖形並返回一個錯誤。

使用scatter,我將range(10)更改爲包含數據點的列表。每個列表包含x,y或z變量。

lo = plt.scatter(xLOutlier, yLOutlier, zLOutlier, marker='x', color=colors[0]) 
ll = plt.scatter(xLoLo, yLoLo, zLoLo, marker='o', color=colors[0]) 
l = plt.scatter(xLo, yLo, zLo, marker='o',color=colors[1]) 
a = plt.scatter(xAverage, yAverage, zAverage, marker='o',color=colors[2]) 
h = plt.scatter(xHi, yHi, zHi, marker='o',color=colors[3]) 
hh = plt.scatter(xHiHi, yHiHi, zHiHi, marker='o',color=colors[4]) 
ho = plt.scatter(xHOutlier, yHOutlier, zHOutlier, marker='x', color=colors[4]) 
plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi',  'High Outlier'),scatterpoints=1, loc='lower left', ncol=3, fontsize=8) 

當我運行這個時,圖例不再存在,它是一個小角落裏沒有任何東西的白色盒子。

有什麼建議嗎?

+0

我相信一個更好的解決方案給出[這裏](http://stackoverflow.com/questions/21654635/scatter-plots-in-pandas-pyplot-how-to-plot逐類)。 – dmvianna

回答

82

2D散點圖

使用matplotlib.pyplot模塊的scatter方法應該工作(至少matplotlib 1.2.1與Python 2.7.5),如下面的示例代碼。此外,如果您正在使用散點圖,則在圖例調用中使用scatterpoints=1而不是numpoints=1,以便每個圖例條目只有一個點。

在下面的代碼中,我使用了隨機值,而不是一遍又一遍地繪製相同的範圍,使所有的圖都可見(即彼此不重疊)。

import matplotlib.pyplot as plt 
from numpy.random import random 

colors = ['b', 'c', 'y', 'm', 'r'] 

lo = plt.scatter(random(10), random(10), marker='x', color=colors[0]) 
ll = plt.scatter(random(10), random(10), marker='o', color=colors[0]) 
l = plt.scatter(random(10), random(10), marker='o', color=colors[1]) 
a = plt.scatter(random(10), random(10), marker='o', color=colors[2]) 
h = plt.scatter(random(10), random(10), marker='o', color=colors[3]) 
hh = plt.scatter(random(10), random(10), marker='o', color=colors[4]) 
ho = plt.scatter(random(10), random(10), marker='x', color=colors[4]) 

plt.legend((lo, ll, l, a, h, hh, ho), 
      ('Low Outlier', 'LoLo', 'Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'), 
      scatterpoints=1, 
      loc='lower left', 
      ncol=3, 
      fontsize=8) 

plt.show() 

enter image description here

3D散點圖

要繪製三維分散,使用plot方法,因爲傳說不支持Patch3DCollection作爲由Axes3D實例的scatter方法返回。要指定標記樣式,可以將其作爲方法調用中的位置參數包含在內,如下面的示例所示。可選地,可以包含參數linestyle和參數。

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

colors=['b', 'c', 'y', 'm', 'r'] 

ax = plt.subplot(111, projection='3d') 

ax.plot(random(10), random(10), random(10), 'x', color=colors[0], label='Low Outlier') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[0], label='LoLo') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[1], label='Lo') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[2], label='Average') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[3], label='Hi') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[4], label='HiHi') 
ax.plot(random(10), random(10), random(10), 'x', color=colors[4], label='High Outlier') 

plt.legend(loc='upper left', numpoints=1, ncol=3, fontsize=8, bbox_to_anchor=(0, 0)) 

plt.show() 

enter image description here

+0

這是否也適用於3D散點圖? – user2386081

+1

爲了讓圖例在繪製3D散點圖時能夠正常工作,請使用'plot'方法和標記作爲位置參數。請參閱編輯。 – hooy