matplotlib: изменение положения полос - PullRequest
2 голосов
/ 27 мая 2020

Я пытаюсь создать подзаголовок гистограммы в matplotlib с 2 гистограммами на оси x. Я создал следующее изображение:

subplotted_bar

Это было создано с помощью следующего кода:

import pandas as pd
import matplotlib.pyplot as plt

ydata1=pd.Series.from_array([451,505])
ydata2=pd.Series.from_array([839,286])

fig, (ax1, ax2) = plt.subplots(1,2,sharex='col',sharey='row')
xlabels = ['x1', 'x2']
ax1.bar(xlabels,ydata1, 0.4, align='center') #0.4 is width of bar
ax2.bar(xlabels,ydata2, 0.4, align='center')
plt.show()

Проблема, с которой я столкнулся, - я бы хотел чтобы отрегулировать положение полос так, чтобы они были симметричными и располагались на равном расстоянии от края каждого фасета, в отличие от левого и правого краев каждого фасета (как сейчас). Есть ли способ настроить положение полос в matplotlib так, чтобы они были симметричными?

Спасибо

1 Ответ

2 голосов
/ 27 мая 2020

Чтобы получить точное поле в зависимости от ширины полосы и количества полосок, обратите внимание:

  • центры полос находятся в позициях 0, 1, ..., N-1
  • расстояние между двумя полосами 1-bar_width
  • первый бар начинается с 0-bar_width/2; чтобы иметь одинаковый интервал между полосой и левым полем, как и между самими полосами, левое поле может быть установлено на 0-bar_width/2-(1-bar_width)
  • аналогично, правое поле может быть установлено на N-1+bar_width/2+(1-bar_width)
import matplotlib.pyplot as plt
import numpy as np

N = 8
ydata1 = np.random.randint(200, 800, N)
ydata2 = np.random.randint(200, 800, N)

fig, (ax1, ax2) = plt.subplots(1, 2, sharex='col', sharey='row')
xlabels = [f'x{i}' for i in range(1, N + 1)]
width = 0.4
ax1.bar(xlabels, ydata1, width, align='center')
ax2.bar(xlabels, ydata2, width, align='center')
margin = (1 - width) + width / 2
ax1.set_xlim(-margin, len(xlabels) - 1 + margin)
ax2.set_xlim(-margin, len(xlabels) - 1 + margin)
plt.show()

example plot 8 bars

...