具有相同标签的不同散点图标记

时间:2015-05-11 06:12:45

标签: matplotlib label legend scatter-plot markers

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

然而,我的两个(金星和火星)标记在图例中重叠。我尝试使用handlelength,但这似乎没有帮助。任何建议或意见都会有所帮助。

2 个答案:

答案 0 :(得分:3)

可能的解决方法是在第一列中创建一个带有空白标签的两列图例:

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

legend with two columns

答案 1 :(得分:2)

这是我的解决方案MWE。我实际上绘制了两个额外的"图表",point_gpoint_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()

注意:如果使用unicode符号,则不需要LaTeX前导码。我无法让他们在我的系统(Linux)上工作,所以我使用了LaTeX符号。此方法适用于所有符号,只需删除plt.rc命令,然后将\\male\\female更改为您的unicode字符。