使补丁更大,用作matplotlib中的图例

时间:2018-12-19 11:03:04

标签: python matplotlib

我正在使用matplotlib类在from matplotlib.patches import Patch内部的图中添加补丁。请参见下面的示例代码-

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

n = 5
hatch_1 = 'o'
hatch_2 = '.'
opacity = 0.4
bar_width = 0.4

y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

bars = plt.bar(x, y, bar_width, align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_1)

y = np.random.randint(low=0, high=10, size=n)
bars = plt.bar(x + bar_width, y, bar_width,
               align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_2)

patch_1 = Patch(fill=False, label='Hatch 1', hatch=hatch_1, alpha=opacity)
patch_2 = Patch(fill=False, label='Hatch 2', hatch=hatch_2, alpha=opacity)

# add legends
plt.legend(handles=[patch_1, patch_2], loc='upper right')

plt.show()

下面是生成的图- screenshot of the plot

用于图例的舱口盖不正确。我想如果我把补丁做大些,那将是可见的。

如何使补丁变大?

4 个答案:

答案 0 :(得分:2)

您可以通过两种方式更改图例补丁的大小。

首先,您可以使用handlelength选项将宽度增加到plt.legend

但是,无法使用kwargs来增加它们的高度。因此,我们需要在创建图例之后遍历补丁。如果在创建图例leg = plt.legend(...)时保留了图例的引用,则可以使用for patch in leg.get_patches():遍历补丁。

然后,您可以使用patch.set_height()更改色块的高度。

但是,所有这些修补都意味着它们不会完全正确对齐。因此,我们还需要稍微更改其垂直位置(使用patch.set_y())。

我还发现它有助于增加图例中标签的垂直间距,以使其很好地适应(使用labelspacing kwarg)。

最后,我在图例标签的开头添加了新行,以使它们看上去都很好(label='\nHatch 1')。

下面是一个完整的脚本。您可能希望使用labelspacinghandlelengthpatch.set_height()patch.set_y()的值来满足您的需求。

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

n = 5
hatch_1 = 'o'
hatch_2 = '.'
opacity = 0.4
bar_width = 0.4

y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

bars = plt.bar(x, y, bar_width, align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_1)

y = np.random.randint(low=0, high=10, size=n)
bars = plt.bar(x + bar_width, y, bar_width,
               align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_2)

patch_1 = Patch(fill=False, label='\nHatch 1', hatch=hatch_1, alpha=opacity)
patch_2 = Patch(fill=False, label='\nHatch 2', hatch=hatch_2, alpha=opacity)

# add legends
leg = plt.legend(handles=[patch_1, patch_2], loc='upper right', labelspacing=1.5, handlelength=4)

for patch in leg.get_patches():
    patch.set_height(22)
    patch.set_y(-6)

plt.show()

enter image description here

答案 1 :(得分:1)

n = 5
hatch_1 = 'O'
hatch_2 = '.'
opacity = 0.4
bar_width = 0.4

y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

bars = plt.bar(x, y, bar_width, align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_1)

y = np.random.randint(low=0, high=10, size=n)
bars = plt.bar(x + bar_width, y, bar_width,
               align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_2)

patch_1 = Patch(fill=False, label='Hatch 1', hatch=hatch_1, alpha=opacity)
patch_2 = Patch(fill=False, label='Hatch 2', hatch=hatch_2, alpha=opacity)
plt.rcParams['figure.figsize'] = (25,15)
# add legends
plt.legend(handles=[patch_1, patch_2], loc='upper right')

plt.show()

Made your small o as O and increase the size of figure that will make sense i guess

答案 2 :(得分:1)

我认为matplotlib提供的最简单的方法是使用prop大小来增加/减小图例大小来定义图例的属性。您只需要执行以下操作即可选择'size'作为首选。

plt.legend(handles=[patch_1, patch_2], loc='best', prop={'size': 24})

enter image description here

答案 3 :(得分:1)

虽然@tmdavison的解决方案效果很好,但其中有些涉及。

由于此处的主要问题是在图例中不容易识别图案填充,因此不太理想但更简单的解决方法是增加图案填充密度,这可以通过重复所需的图案填充字符(即替换{{1 }}和o

ooo

bar plot with different hatch densities