2013-12-03 4 views
-3

Я могу построить гистограмму, в которой я нуждаюсь. Однако штанги перекрываются друг над другом. Как вы можете видеть, я изменил ширину bars to 0.2, но он все еще перекрывается. Какая ошибка я делаю?Гистограммы, перекрывающие matplotlib

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() 

Вот график: image

+2

Несомненно. Дайте мне 2 минуты. – pistal

+0

Добавлено больше информации. :) – pistal

ответ

1

Как вы можете видеть в приведенном ниже примере, вы можете легко получить не перекрывающиеся полосы с использованием сильно упрощенной версии черчения кода. Я бы посоветовал вам более внимательно посмотреть, действительно ли то, что вы ожидаете от них, - x и y. (И что вы пытаетесь упростить свой код как можно больше, если вы ищете ошибку в коде.)

Также посмотрите на вычисление баров 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() 

Это является результатом изображения:

barchart example

Для справки:

+0

У меня все еще такая же проблема. – pistal

+0

Я думаю, что проблема заключается в том, как я группирую. – pistal

+0

@pistal: тогда вам, вероятно, следует удалить материал для печати из вашего вопроса, поскольку он отвлекает потенциальных читателей от реальной проблемы. Добавьте исходные данные и ожидаемый результат для уточнения и чтобы мы могли воспроизвести реальную проблему. – moooeeeep

0

Проблема в том, что ширина ваших баров рассчитывается по трем предметам, а не по двенадцать баров на одного объекта. Это означает, что вы размещаете несколько баров в каждой позиции 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) 
Смежные вопросы