【问题标题】:Histogram bars overlapping matplotlib直方图条重叠 matplotlib
【发布时间】:2013-12-03 08:37:54
【问题描述】:

我能够构建我需要的直方图。然而,这些条相互重叠。 如您所见,我更改了bars to 0.2 的宽度,但它仍然重叠。我做错了什么?

from matplotlib import pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties
from random import randrange

color = ['r', 'b', 'g','c','m','y','k','darkgreen', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred']
label = ['2','6','10','14','18','22','26','30','34','38','42','46']
file_names = ['a','b','c']
diff = [[randrange(10) for a in range(0, len(label))] for a in range(0, len(file_names))]
print diff
x = diff
name = file_names
y = zip(*x)
pos = np.arange(len(x))
width = 1. / (1 + len(x))
fig, ax = plt.subplots()
for idx, (serie, color,label) in enumerate(zip(y, color,label)):
        ax.bar(pos + idx * width, serie, width, color=color, label=label)
ax.set_xticks(pos + width)
plt.xlabel('foo')
plt.ylabel('bar')
ax.set_xticklabels(name)
ax.legend()
plt.savefig("final" + '.eps', bbox_inches='tight', pad_inches=0.5,dpi=100,format="eps")
plt.clf()

这是图表:

【问题讨论】:

  • 当然。给我2分钟。

标签: python numpy matplotlib


【解决方案1】:

正如您在下面的示例中所见,您可以使用高度简化的绘图代码版本轻松获得不重叠的条形图。我建议你仔细看看xy 是否真的是你所期望的那样。 (并且当您在代码中查找错误时,您会尝试尽可能地简化代码。)

还可以查看条形的width 的计算。您似乎为此使用了主题数,而应该是每个主题的条数。

看看这个例子:

import numpy as np
import matplotlib.pyplot as plt

subjects = ('Tom', 'Dick', 'Harry', 'Sally', 'Sue')
# number of bars per subject
n = 5
# y-data per subject
y = np.random.rand(n, len(subjects))
# x-positions for the bars
x = np.arange(len(subjects))

# plot bars
width = 1./(1+n) # <-- n.b., use number of bars, not number of subjects

for i, yi in enumerate(y):
    plt.bar(x+i*width, yi, width)

# add labels
plt.xticks(x+n/2.*width, subjects)

plt.show()

这是结果图片:

供参考:

【讨论】:

  • 我还是有同样的问题。
  • 我认为问题在于我的分组方式。
  • @pistal:那么您可能应该从问题中删除绘图内容,因为它会分散潜在读者对真正问题的注意力。添加输入数据和预期输出以澄清并使我们能够重现真正的问题。
  • remove plotting stuff 是什么意思?我确实添加了一些输入数据,并且输出必须清晰,即直方图中的非重叠条形。
  • @pistal:停止在每一行代码中加入尽可能多的逻辑。保持简单,检查您的输入数据,看看出现问题时是否符合预期。
【解决方案2】:

问题在于,条形的宽度是根据三个科目计算的,而不是每个科目的十二个条形。这意味着您要在每个 x 位置放置多个条形图。尝试在适当的地方交换这些行来解决这个问题:

n = len(x[0])  # New variable with the right length to calculate bar width
width = 1. / (1 + n)
ax.set_xticks(pos + n/2. * width)

【讨论】: