在直方图中绘制多个数据系列

5
当我为柱状图着色时,它接受不同颜色的列表,但是对于阴影处理,它只接受一个值。
以下是代码:
import numpy as np
import matplotlib.pylab as plt


data = [np.random.rand(100) + 10 * i for i in range(3)]
ax1 = plt.subplot(111)

n, bins, patches = ax1.hist(data, 20, histtype='bar',
                        color=['0', '0.33', '0.66'],
                        label=['normal I', 'normal II', 'normal III'],
                        hatch= ['', 'o', '/'])

我如何为不同的系列设置不同的填充图案?


1
我遇到了错误 TypeError: unhashable type: 'list',所以我尝试使用元组代替,例如 hatch= ('', 'o', '/'),这样可以达到你想要的效果吗? - Tadhg McDonald-Jensen
不要紧,将所有三个斜杠应用于每一个而不是每一个应用一个(就像使用“o /”作为斜杠)。 - Tadhg McDonald-Jensen
1个回答

12

很遗憾,hist似乎不支持多个填充图案用于多系列绘图。但是,您可以通过以下方式解决:

import numpy as np
import matplotlib.pylab as plt    

data = [np.random.rand(100) + 10 * i for i in range(3)]
ax1 = plt.subplot(111)

n, bins, patches = ax1.hist(data, 20, histtype='bar',
                        color=['0', '0.33', '0.66'],
                        label=['normal I', 'normal II', 'normal III'])

hatches = ['', 'o', '/']
for patch_set, hatch in zip(patches, hatches):
    for patch in patch_set.patches:
        patch.set_hatch(hatch)
< p >函数hist返回的对象patches是一个包含多个BarContainer对象的列表,每个BarContainer对象都包含一组Patch对象(在BarContainer.patches中)。因此,您可以访问每个Patch对象并显式地设置其填充图案。< /p>< p >或者如@MadPhysicist所指出的那样,您可以对每个patch_set使用plt.setp,以便循环可以缩短为:< /p>
for patch_set, hatch in zip(patches, hatches):
    plt.setp(patch_set, hatch=hatch)

1
请不要使用列表推导式作为嵌套的单行循环。它会生成一系列需要之后丢弃的“None”值。相反,可以编写一个函数来获取补丁和图案,并应用它们。 - Tadhg McDonald-Jensen
1
这个一行代码看起来可以从 plt.setp 中受益。 - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接