Построение нескольких столбцов с помощью matplotlib с помощью ax.bar () - PullRequest
3 голосов
/ 10 мая 2019

В ответ на мой предыдущий вопрос: Сортировка объектов даты и времени по часам в кадр данных pandas, а затем визуализация в гистограмму.

Мне нужно построить 3 бара для одного значения оси X, представляющего количество зрителей.Теперь они показывают тех, кто меньше одной минуты и выше.Мне нужен показ всех зрителей.У меня есть датафрейм, но я не могу заставить их выглядеть правильно.С двумя барами у меня нет проблем, все выглядит так, как если бы я хотел его с двумя барами: I need to plot 3 bars for one X-axis value representing viewer counts.

Соответствующая часть кода для этого:

# Time and date stamp variables
allviews = int(df['time'].dt.hour.count())
date = str(df['date'][0].date())
hours = df_hist_short.index.tolist()
hours[:] = [str(x) + ':00' for x in hours]

Переменная часов, которую я использую для представления оси X, может быть проблематичной, так как я преобразую ее в строку, чтобы я мог сделать часы похожими на 23:00 вместо просто вывода индекса панд 23 и т. Д. Iвидел примеры, когда люди складывают или вычитают значения из X, чтобы изменить положение столбцов.

fig, ax = plt.subplots(figsize=(20, 5))
short_viewers = ax.bar(hours, df_hist_short['time'], width=-0.35, align='edge')
long_viewers = ax.bar(hours, df_hist_long['time'], width=0.35, align='edge')

Теперь я установил align='edge', и два значения ширины - это абсолютные и отрицательные значения.Но я понятия не имею, как сделать так, чтобы это выглядело правильно с 3 барами.Я не нашел никаких аргументов позиционирования для баров.Также я пытался работать с plt.hist (), но я не мог получить тот же вывод, что и с функцией plt.bar ().

Так что в результате я хотел бы иметь 3-й бар награфик, показанный выше с левой стороны, немного шире, чем два других.

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

pandas сделает это выравнивание для вас, если вы строите гистограмму за один шаг, а не за два (или три).Рассмотрим этот пример (адаптированный из документов для добавления третьего столбца для каждого животного).

import pandas as pd
import matplotlib.pyplot as plt

speed = [0.1, 17.5, 40, 48, 52, 69, 88]
lifespan = [2, 8, 70, 1.5, 25, 12, 28]
height = [1, 5, 20, 3, 30, 6, 10]
index = ['snail', 'pig', 'elephant',
         'rabbit', 'giraffe', 'coyote', 'horse']
df = pd.DataFrame({'speed': speed,
                   'lifespan': lifespan,
                   'height': height}, index=index)
ax = df.plot.bar(rot=0)

plt.show()

enter image description here

1 голос
/ 10 мая 2019

В чистом matplotlib вместо использования параметра ширины для позиционирования баров, как вы сделали, вы можете настроить значения x для своего графика:

import numpy as np
import matplotlib.pyplot as plt

# Make some fake data:
n_series = 3
n_observations = 5
x = np.arange(n_observations)
data = np.random.random((n_observations,n_series))


# Plotting:

fig, ax = plt.subplots(figsize=(20,5))

# Determine bar widths
width_cluster = 0.7
width_bar = width_cluster/n_series

for n in range(n_series):
    x_positions = x+(width_bar*n)-width_cluster/2
    ax.bar(x_positions, data[:,n], width_bar, align='edge')

enter image description here

В вашем конкретном случае, seaborn , вероятно, является хорошим вариантом.Вы должны (почти всегда) стараться хранить ваши данные в long-form , поэтому вместо трех отдельных фреймов данных для короткого, среднего и длинного гораздо лучше хранить один фрейм данных и добавить столбец, которыйпомечает каждый ряд как короткий, средний или длинный.Используйте этот новый столбец в качестве параметра hue в Seaborn's barplot

...