2013-07-01 10 views
34

Stworzyłem wykres wykresu rozproszenia 4D, aby przedstawić różne temperatury w określonym obszarze. Kiedy utworzę legendę, legenda pokazuje poprawny symbol i kolor, ale dodaje do niego linię. Kod używam jest:Legenda plotowania działek 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) 

Próbowałem zmieniając Line2D do Scatter i scatter. Scatter zwrócił błąd i scatter zmienił wykres i zwrócił błąd.

Z scatter, zmieniłem range(10) na listy zawierające punkty danych. Każda lista zawiera zmienną x, y lub 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) 

Po uruchomieniu legenda już nie istnieje, jest to małe białe pudełko w rogu bez niczego w nim.

Każda rada?

+0

wierzę, dużo lepszym rozwiązaniem Podane [tutaj] (http://stackoverflow.com/questions/21654635/scatter-plots-in-pandas-pyplot-how-to-plot -do-kategorii). – dmvianna

Odpowiedz

82

rozrzut 2D wykres

Sposobem modułu matplotlib.pyplotscatter powinien działać (przynajmniej matplotlib 1.2.1 Pythona 2.7.5), tak jak w przykładzie kodu poniżej. Ponadto, jeśli używasz wykresów rozproszonych, użyj scatterpoints=1 zamiast numpoints=1 w wywołaniu legendy, aby mieć tylko jeden punkt dla każdego wpisu legendy.

W poniższym kodzie użyłem wartości losowych zamiast ciągłego wykreślania tego samego zakresu, dzięki czemu wszystkie wykresy są widoczne (tzn. Nie zachodzą na siebie).

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

rozrzut 3D wykres

wykreślić rozrzut 3D, należy zastosować metodę plot jak legenda nie obsługuje Patch3DCollection jak zwrócone metodą na przykład Axes3Dscatter. Aby określić styl znacznika, można uwzględnić go jako argument pozycyjny w wywołaniu metody, jak widać w przykładzie poniżej. Opcjonalnie można dołączyć argument zarówno do parametrów linestyle i 0124565285145.

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

Czy to działa również w przypadku wykresów rozproszonych w 3D? – user2386081

+1

Aby legenda działała podczas drukowania rozproszenia 3D, należy użyć metody 'plot' z markerem jako argumentem pozycyjnym. Zobacz edycję. – hooy