5.3. Bar - гистограмма

Гистограммы устроены очень просто, но изменяя различные параметры мы можем отобразить с их помощью очень много информации, а так же повысить как наглядность данных так и привлекательность самого графика.

Ширина прямоугольников

Чаще всего мы строим гистограммы из одиночных наборов данных, в таких случаях мы можем обойтись, вообще, без каких бы то ни было изменений графика. Просто строим одну или несколько гистограмм на одной области Figure:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y = np.random.randint(1, 20, size = 7)

fig, ax = plt.subplots()

ax.bar(x, y)

ax.set_facecolor('seashell')
fig.set_facecolor('floralwhite')
fig.set_figwidth(12)    #  ширина Figure
fig.set_figheight(6)    #  высота Figure

plt.show()

Matplotlib bar: ширина прямоугольников по умолчанию

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x1 = np.arange(1, 8)
y1 = np.random.randint(1, 20, size = 7)
x2 = np.arange(1, 101)
y2 = np.random.randint(1, 20, size = 100)

fig, axes = plt.subplots(2, 1)

axes[0].bar(x1, y1)
axes[1].bar(x2, y2)

axes[0].set_facecolor('seashell')
axes[1].set_facecolor('seashell')
fig.set_facecolor('floralwhite')
fig.set_figwidth(12)    #  ширина Figure
fig.set_figheight(6)    #  высота Figure

plt.show()

Matplotlib bar: ширина прямоугольников по умолчанию на разных областях Axes

Ширина прямоугольников подбирается автоматически и нас это, вполне, устраивает. Но если мы имеем дело с несколькими наборами данных, которые нужно отобразить в пределах одной области Axes, то прямоугольники начинают перекрывать друг друга:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y1 = np.random.randint(1, 10, size = 7)
y2 = np.random.randint(1, 10, size = 7)

fig, ax = plt.subplots()

ax.bar(x, y1)
ax.bar(x, y2)

ax.set_facecolor('seashell')
fig.set_figwidth(12)    #  ширина Figure
fig.set_figheight(6)    #  высота Figure
fig.set_facecolor('floralwhite')

plt.show()

Matplotlib bar: прямоугольники из разных наборов данных с одинаковой шириной и позицией перекрывают друг друга

В таких случаях, нам необходимо вручную задавать ширину с помощью параметра width и смещение прямоугольников в массиве x:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

#  Задаем смещение равное половине ширины прямоугольника:
x1 = np.arange(1, 8) - 0.2
x2 = np.arange(1, 8) + 0.2
y1 = np.random.randint(1, 10, size = 7)
y2 = np.random.randint(1, 10, size = 7)

fig, ax = plt.subplots()

ax.bar(x1, y1, width = 0.4)
ax.bar(x2, y2, width = 0.4)

ax.set_facecolor('seashell')
fig.set_figwidth(12)    #  ширина Figure
fig.set_figheight(6)    #  высота Figure
fig.set_facecolor('floralwhite')

plt.show()

Matplotlib bar: установка ширины и смещения прямоугольников

В некоторых ситуациях ширина прямоугольников, так же как и их высота, может быть пропорциональна некоторой величине. Что бы задать ширину каждого отдельного прямоугольника можно указать параметр width в виде массива чисел:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y = np.random.randint(1, 10, size = 7)

fig, ax = plt.subplots()

width_rectangle = np.random.rand(7)
ax.bar(x, y, width = width_rectangle)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib bar: установка ширины каждого отдельного прямоугольника


Выравнивание нижнего края прямоугольников

Разместить несколько гистограмм на одной области Axes можно не только с помощью горизонтального смещения и изменения ширины прямоугольников, но и с помощью параметра bottom, который задает значение по которому выравнивается нижний край прямоугольников:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y1 = np.random.randint(1, 10, size = 7)
y2 = np.random.randint(1, 10, size = 7)
y3 = np.random.randint(1, 10, size = 7)


fig, ax = plt.subplots()

ax.bar(x, y1)
ax.bar(x, y2, bottom = 11)
ax.bar(x, y3, bottom = 21)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib bar: выравнивание нижнего края всех прямоугольников

Выравнивание для каждого прямоугольника можно задать с помощью массива:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 51)
y = np.random.randint(1, 50, size = 50)

fig, ax = plt.subplots()

bottom_rectangle = np.random.randint(30, size = 50)
ax.bar(x, y, bottom = bottom_rectangle)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib bar: выравнивание нижнего каждого отдельного прямоугольника

Для того что бы состыковать прямоугольники нескольких наборов данных, достаточно выровнять одни прямоугольники по значениям других:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
data_1 = np.random.randint(2, 15, size = 7)
data_2 = np.random.randint(3, 20, size = 7)



fig, ax = plt.subplots()

ax.bar(x, data_1)
ax.bar(x, data_2, bottom = data_1)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib bar: выравнивание нижнего края прямоугольников из одного набора данных по высоте прямоугольников из другого


Цвет

Для того что бы задать цвет всех прямоугольников достаточно указать его в параметре color:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y = np.random.randint(1, 10, size = 7)


fig, ax = plt.subplots()

ax.bar(x, y, color = 'red')


fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib bar: цвет всех прямоугольников

Так же возможно задать цвет каждого отдельного прямоугольника, указав в параметре color массив цветов:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y = np.random.randint(1, 10, size = 7)

fig, ax = plt.subplots()

color_rectangle = np.random.rand(7, 3)    # RGB
ax.bar(x, y, color = color_rectangle)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib bar: цвет каждого отдельного прямоугольника

Не забывайте, что matplotlib поддерживает разные цветовые модели и форматы. Задавая цвет в модели RGBA вы можете контролировать прозрачность прямоугольников, что так же позволяет размещать несколько наборов данных, но без смещения:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y1 = np.random.randint(1, 10, size = 7)
y2 = np.random.randint(1, 10, size = 7)

fig, ax = plt.subplots()

color_rectangle = np.random.rand(7, 3)    # RGB
ax.bar(x, y1, color = color_rectangle, width = 0.5)

color_rectangle = np.random.rand(7, 4)    # RGBA
color_rectangle[:,3] = 0.5
ax.bar(x, y2, color = color_rectangle)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib bar: цвет и прозрачность каждого отдельного прямоугольника

Если вам необходимо выделить границу прямоугольников, то вы можете задать ее цвет (edgecolor) и толщину (linewidth):

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y = np.random.randint(1, 10, size = 7)

fig, ax = plt.subplots()

ax.bar(x, y,
       color = 'chartreuse',
       edgecolor = 'darkblue',
       linewidth = 5)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
ax.set_facecolor('darkslateblue')

plt.show()

Matplotlib bar: цвет и толщина края прямоугольников


Отображение погрешности

На гистограммах можно указывать погрешность измерения величины, как по горизонтали (xerr) так и вертикали (xerr):

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y = np.random.randint(1, 10, size = 7)

fig, axes = plt.subplots(2, 1)

x_error = np.random.rand(7)
axes[0].bar(x, y,
            xerr = x_error,
            width = 0.3)

y_error = np.random.rand(7)*2
axes[1].bar(x, y,
            yerr = y_error,
            width = 0.5)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
fig.set_facecolor('floralwhite')
axes[0].set_facecolor('seashell')
axes[1].set_facecolor('seashell')

plt.show()

Matplotlib bar: горизонтальная и вертикальная погрешности

Одно число задает одинаковую погрешность, массив чисел длинной x задает разную но симметричную погрешность для каждого прямоугольника, а массив чисел с формой (2, x) задает минимальное и максимальное значение погрешности для каждого прямоугольника:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 13)
y = np.random.randint(5, 20, size = 12)

fig, axes = plt.subplots(3, 1)

axes[0].bar(x, y, yerr = 1)

y_error = np.random.rand(12)*5
axes[1].bar(x, y,
            yerr = y_error)

y_error = np.random.rand(2,12)*10
y_error[:][0] /= 2 
axes[2].bar(x, y,
            yerr = y_error)

axes[0].set_title('Одинаковая погрешность')
axes[1].set_title('Разная, но симметричная погрешность')
axes[2].set_title('Максимальная и минимальная погрешность')
axes[0].set_xticks([])
axes[1].set_xticks([])
axes[0].set_facecolor('seashell')
axes[1].set_facecolor('seashell')
axes[2].set_facecolor('seashell')
fig.set_figwidth(12)    #  ширина и
fig.set_figheight(9)    #  высота "Figure"
fig.set_facecolor('floralwhite')

plt.show()

Matplotlib bar: отображение одинаковой, разной но симметричной, максимальной и минимальной погрешности

Линии погрешности так же можно видоизменять:

# Горизонтальная ошибка
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 8)
y = np.random.randint(1, 10, size = 7)


fig, ax = plt.subplots()

y_error = np.random.randint(5, 20, size = (2, 7))/15
ax.bar(x, y, 
       yerr = y_error,      #  границы погрешностей
       ecolor = 'darkred',  #  цвет линии погрешности
       capsize = 10,        #  горизонтальная черточка
       edgecolor = 'red',   #  цвет края прямоугольника
       linewidth = 2,       #  ширина крайней линии
       color = 'seashell',  #  цвет прямоугольника
       linestyle = '--')    #  начертание линии


fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib bar: внешний вид линий погрешности