2013-07-01 3 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) 

Я попытался изменить Line2D к Scatter и scatter. Scatter возвращено с ошибкой, и 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 график рассеяния

Используя scatter метод matplotlib.pyplot модуль должен работать (по крайней мере, с 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 график рассеяния

Чтобы построить разброс в 3D, используйте метод plot, как легенда не поддерживает Patch3DCollection как возвращаемый scatter методом в Axes3D инстанции. Чтобы указать маркерный стиль, вы можете включить его в качестве позиционного аргумента в вызове метода, как показано в примере ниже. Необязательно можно включить аргумент как для параметров 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

Смежные вопросы