2013-12-10 2 views
3

Я хочу создать 3D-диаграмму рассеяния с различными наборами данных в том же сюжете и легендой с их ярлыками. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу правильно добавить легенду, и я получаю график с пустой меткой в ​​виде цифры в http://tinypic.com/view.php?pic=4jnm83&s=5#.Uqd-05GP-gQ. В частности, я получаю сообщение об ошибке: "warnings.warn (" Легенда не поддерживает% s \ nИспользует прокси-исполнителя вместо. \ N \ nhttp: //matplotlib.sourceforge.net/users/legend_guide.html#using-proxy- artist \ n "% (str (orig_handle),)) /usr/lib/pymodules/python2.7/matplotlib/legend.py:610: UserWarning: Legend не поддерживает Вместо этого используйте прокси-исполнителя."Добавить легенду в 3D-диаграмме рассеяния с разбросом() в Matplotlib

Вы можете найти ниже в качестве примера демонстрации того, что я пытался до сих пор:

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) 

Проблема в том, что функция легенды не поддерживает тип, возвращаемый трехмерным разбросом. Поэтому вам нужно создать «фиктивный сюжет» с теми же характеристиками и поместить его в легенду.

NumPoints = 1, чтобы получить только одну точку в легенде
LineStyle = «нет» Так что нет никакого линия, проведенная в легенде

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