matplotlib:使图例键正方形

时间:2015-01-07 18:23:49

标签: python matplotlib

我正在使用matplotlib,并希望将我的图例中的键更改为正方形而不是矩形,例如,当我制作条形图时。有没有办法指定这个?

我现在拥有的:

enter image description here

我想要的是什么:

enter image description here

谢谢!

3 个答案:

答案 0 :(得分:5)

如果你想要一个非常快速和肮脏的解决方案来获得一个近似的平方(可能需要根据你的情节进行一些微调),你可以调整图例调用中的handlelength kwarg。遵循Schorsch的解决方案(即,一旦你有一个矩形传奇艺术家和相应的标签列表):

ax.legend((rects1[0], rects2[0]), ('Men', 'Women'), handlelength=0.7)

有关详细信息,请参阅matplotlib legend() docs

答案 1 :(得分:2)

全局修改handlelength会影响图例中其他标记的宽度。因此,该解决方案将与例如不相容。点和线补丁的组合。相反,您只需使用Line2D为图例添加方点标记即可。您只需将其关联的行设置为零宽度:

rect1 = mlines.Line2D([], [], marker="s", markersize=30, linewidth=0, color="r")
rect2 = mlines.Line2D([], [], marker="s", markersize=30, linewidth=0, color="y")
ax.legend((rect1, rect2), ('Men', 'Women'))

答案 2 :(得分:1)

您可以定义自己的图例键。

我的答案中的条形图是使用matplotlib barchart demo创建的。 (我删除了错误栏)。 matplotlib legend guide解释了如何定义用椭圆替换图例键的类。我修改了该类以使用正方形(使用rectangle patches)。

import numpy as np
from matplotlib.legend_handler import HandlerPatch
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

# Define square (rectangular) patches
# that can be used as legend keys
# (this code is based on the legend guide example)

class HandlerSquare(HandlerPatch):
    def create_artists(self, legend, orig_handle,
                       xdescent, ydescent, width, height, fontsize, trans):
        center = xdescent + 0.5 * (width - height), ydescent
        p = mpatches.Rectangle(xy=center, width=height,
                               height=height, angle=0.0)
        self.update_prop(p, orig_handle, legend)
        p.set_transform(trans)
        return [p]      

# this example is the matplotlib barchart example:

N = 5
menMeans = (20, 35, 30, 35, 27)

ind = np.arange(N)  # the x locations for the groups
width = 0.35       # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(ind, menMeans, width, color='r')

womenMeans = (25, 32, 34, 20, 25)
rects2 = ax.bar(ind+width, womenMeans, width, color='y')

# add some text for labels, title and axes ticks
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind+width)
ax.set_xticklabels( ('G1', 'G2', 'G3', 'G4', 'G5') )

# append the new patches to the legend-call:

ax.legend( (rects1[0], rects2[0]), ('Men', 'Women'), 
           handler_map={rects1[0]: HandlerSquare(), rects2[0]: HandlerSquare()})

plt.show()

定义了class HandlerSquare之后,现在可以将其应用于每个图例条目,作为ax.legend调用的第三个参数。请注意语法:

handler_map={rects1[0]: HandlerSquare(), rects2[0]: HandlerSquare()}

handler_map必须是字典。

这将给你这个情节:

enter image description here