2015-06-26 2 views
3

Следующий код генерирует штрих-код с xticklabels, центрированным для каждого бара. Однако масштабирование оси x, изменение количества полос или изменение ширины полосы изменяют положение меток. Существует ли общий способ борьбы с этим поведением?matplotlib barplot, общий способ установки xticklabels в середине панели

# This code is a hackish way of setting the proper position by trial 
# and error. 
import matplotlib.pyplot as plt 
import numpy as np 
y = [1,2,3,4,5] 
# adding 0.75 did the trick but only if I add a blank position to `xl` 
x = np.arange(0,len(y)) + 0.75 
xl = ['', 'apple', 'orange', 'pear', 'mango', 'peach'] 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.bar(x,y,0.5) 
ax.set_xticklabels(xl) 
# I cannot change the scaling without changing the position of the tick labels 
ax.set_xlim(0,5.5) 

Предложенный и рабочий раствор:

import matplotlib.pyplot as plt 
import numpy as np 
y = [1,2,3,4,5] 
x = np.arange(len(y)) 
xl = ['apple', 'orange', 'pear', 'mango', 'peach'] 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.bar(x,y,0.5, align='center') 
ax.set_xticks(x) 
ax.set_xticklabels(xl) 

ответ

5

Таким образом, проблема в том, что вы только звоните ax.set_xticklabels. Это фиксирует метки, но позиции тика все еще обрабатываются AutoLocator, которые будут добавлять/удалять тики при изменении границ оси.

Таким образом, вы также должны зафиксировать позиции клеща:

ax.set_xticks(x) 
ax.set_xticklabels(xl) 

Позвонив set_xticksAutoLocator заменяется под капотом с FixedLocator.

И тогда вы можете центрирования баров, чтобы сделать его лучше (по желанию):

ax.bar(x, y, 0.5, align='center') 
+0

ваш ответ является более полным, поэтому я уступлю, чтобы избежать дублирования и тот же ответ. OP, вам также необходимо удалить начальную галочку перед «яблоком» – tom

+0

Хороший улов, не заметил, что есть 6 ярлыков, но только пять точек данных. – hitzg

+0

Для того чтобы получить центрированные ярлыки, понадобилась начальная тиковая метка. В противном случае мое решение не сработает. – Moritz