2015-05-11 4 views
3

У меня проблемы с «похожими» на Matplotlib, legend with multiple different markers with one label. Благодаря этому вопросу я смог добиться следующего: Combine two Pyplot patches for legend.Различные маркеры разброса с одной и той же этикеткой

fig = pylab.figure() 
figlegend = pylab.figure(figsize=(3,2)) 
ax = fig.add_subplot(111) 
point1 = ax.scatter(range(3), range(1,4), 250, marker=ur'$\u2640$', label = 'S', edgecolor = 'green') 
point2 = ax.scatter(range(3), range(2,5), 250, marker=ur'$\u2640$', label = 'I', edgecolor = 'red') 
point3 = ax.scatter(range(1,4), range(3), 250, marker=ur'$\u2642$', label = 'S', edgecolor = 'green') 
point4 = ax.scatter(range(2,5), range(3), 250, marker=ur'$\u2642$', label = 'I', edgecolor = 'red') 
figlegend.legend(((point1, point3), (point2, point4)), ('S','I'), 'center', scatterpoints = 1, handlelength = 1) 
figlegend.show() 
pylab.show() 

Однако мои две (Венера и Марс) маркеров перекрываются в легенде. Я пробовал играть с длиной handle, но это, похоже, не помогает. Любые предложения или комментарии будут полезны.

ответ

2

Вот мой обходной MWE. Я на самом деле рисую два дополнительных «сюжета», point_g и point_r, у которых есть легендарные ручки, которые мы будем использовать. Затем я закрываю их, используя маркер белого квадрата. Постройте оставшиеся участки по желанию.

import matplotlib.pyplot as plt 
plt.rc('text', usetex=True) 
plt.rc('text', **{'latex.preamble': '\\usepackage{wasysym}'}) 
plt.rc('lines', **{'markersize':20}) 

fig = plt.figure() 

point_g, = plt.plot((0,), (0,), ls='none', marker='$\\male\\female$', mec='g') 
point_r, = plt.plot((0,), (0,), ls='none', marker='$\\male\\female$', mec='r') 
plt.plot((0,), (0,), marker='s', mec='w', mfc='w') 

plt.plot(range(3), range(1,4), ls='none', marker='$\\male$', mec='g') 
plt.plot(range(3), range(2,5), ls='none', marker='$\\male$', mec='r') 
plt.plot(range(1,4), range(3), ls='none', marker='$\\female$', mec='g') 
plt.plot(range(2,5), range(3), ls='none', marker='$\\female$', mec='r') 

plt.axis([-0.1, 4.1, -0.1, 4.1]) 
plt.legend((point_g, point_r), ('Green', 'Red'), markerscale=1.6, numpoints=1, 
      borderpad=0.8, handlelength=3, labelspacing=1) 

plt.show() 

Примечание: Вам не нужен латекс преамбула, если использовать юникод символы. Я не мог заставить их работать в моей системе (Linux), поэтому я использовал символы LaTeX. Этот метод будет работать со всеми символами, просто удалите команды plt.rc и измените \\male и \\female на символы юникода.

3

Возможным решением является создание легенды в два столбца с пустыми этикетки в первом столбце:

figlegend.legend((point1, point2, point3, point4), (' ', ' ', 'S', 'I'), 
       'center', scatterpoints = 1, ncol = 2) 

legend with two columns

+0

Вы также можете отрегулировать расстояние между столбцами, чтобы сблизить их. – Blink

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