matplotlib 在直方图中为不同类别创建带有不同颜色条的图

ubby3x7f  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(175)

我正在尝试绘制一个直方图,如下所示,每10个值使用不同的颜色。

然而,我不确定直方图中的箱,只能得到如下图。

y=[500, 477, 455, 434, 415, 396, 378, 361, 344, 328, 314, 299, 286, 273, 260, 248, 237, 226, 216, 206, 197, 188, 179, 171, 163, 156, 149, 142, 135, 129, 123, 118, 112, 107, 102, 98, 93, 89, 85, 81, 77, 74, 70, 67, 64, 61, 58, 56, 53, 51, 48, 46, 44, 42, 40, 38, 36, 35, 33, 32, 30, 29, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 15, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5]
x = list(range(100))
plt.hist(y,x)

直方图看起来像

任何帮助都将不胜感激。TIA

goqiplq2

goqiplq21#

plt.hist(y, x)生成y值的直方图,并使用x确定柱形。因此,创建了99个条形。首先,有5个高度为0的条形,因为没有低于5的y值。然后,有一个高度为4的条形,因为有4个y值的值为5,然后是另一个高度为4的条形,对应于6。
但是,由于y值似乎对应于每个x的计数,因此可以直接创建条形图。
您可以创建一个条形图。plt.bar有一个方便的参数color,您可以在其中为每个条形提供一个颜色。可以使用条形的平均x位置定位刻度标签。

import matplotlib.pyplot as plt

y = [500, 477, 455, 434, 415, 396, 378, 361, 344, 328, 314, 299, 286, 273, 260, 248, 237, 226, 216, 206, 197, 188, 179, 171, 163, 156, 149, 142, 135, 129, 123, 118, 112, 107, 102, 98, 93, 89, 85, 81, 77, 74, 70, 67, 64, 61, 58, 56, 53, 51, 48, 46, 44, 42, 40, 38, 36, 35, 33, 32, 30, 29, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 15, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5]
x = list(range(100))

colors = plt.cm.tab10.colors

plt.figure(figsize=(20, 5))
plt.bar(x, y, color=[c for c in colors for _ in range(10)])

# set ticks at the mean positions of the bars
ticks = [sum([xi for xi in x[i:i + 10]]) / 10 for i in range(0, 100, 10)]
labels = [f'task{i}' for i in range(1, 11)]
plt.xticks(ticks, labels)

plt.margins(x=0.003) # less empty space at the left and right of the bars
plt.show()

jutyujz0

jutyujz02#

我认为你应该使用plt.bar()与x和y根据您的要求,而不是直方图。这将给你的酒吧你想要的方式。此外,你可以选择颜色的每个酒吧使用set_color(your_color)。更新的代码如下。请确保你有足够的颜色在列表中,以便您可以显示不同的颜色。希望这是你正在寻找的...

y=[500, 477, 455, 434, 415, 396, 378, 361, 344, 328, 314, 299, 286, 273, 260, 248, 237, 226, 216, 206, 197, 188, 179, 171, 163, 156, 149, 142, 135, 129, 123, 118, 112, 107, 102, 98, 93, 89, 85, 81, 77, 74, 70, 67, 64, 61, 58, 56, 53, 51, 48, 46, 44, 42, 40, 38, 36, 35, 33, 32, 30, 29, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 15, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5]
x = list(range(100))

## The list of colors you want to display (10 here as you have 100 entries)
colors = ['b', 'r', 'g', 'k', 'c', 'm', 'y', 'tab:orange', 'tab:brown', 'tab:gray']

## Plot bars
bars=plt.bar(y,x)

## For each bar, set color... i/10 will give same color to 10 bars
for i, item in enumerate(bars):
    item.set_color(colors[int(i/10)])
    • 输出图**

相关问题