4

I am having 'similar' issues to Matplotlib, legend with multiple different markers with one label. I was able to achieve the following thanks to this question 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()

However, my two (venus and mars) markers overlap in the legend. I tried playing with handlelength, but that doesn't seem to help. Any suggestions or comments would be helpful.

Community
  • 1
  • 1
Mischief_Monkey
  • 145
  • 2
  • 11

2 Answers2

3

A possible workaround is to create a two column legend with blank labels in the first column:

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

legend with two columns

Molly
  • 13,240
  • 4
  • 44
  • 45
2

Here's my work-around MWE. I actually plot two extra "plots", point_g and point_r which have the legend handles we will use. I then cover them up by using a white squre marker. Plot the remaining plots as desired.

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()

Note: You do not need the LaTeX preamble if you use unicode symbols. I couldn't get them working on my system (Linux) so I used the LaTeX symbols. This method will work with all symbols, just remove the plt.rc commands and change \\male and \\female to your unicode characters.

Blink
  • 1,444
  • 5
  • 17
  • 25