Гистограмма Python и линейная диаграмма с группами на одном графике

У меня есть такие данные:

Group   yq        Value1    Value2
G       2014Q1     0.07        1.1
G       2014Q2     0.06        1.09
G       2014Q3     0.09        1.11
G       2014Q4     0.04        1.13
I       2014Q1     0.10        1.2
I       2014Q2     0.13        1.25
I       2014Q3     0.15        1.23
I       2014Q4     0.18        1.4

Я хочу построить линейную и гистограмму на одном графике.
Сначала я попытался построить столбец, но он вывел два графика (2 группы, G и I):

import matplotlib.pyplot as plt
ax = dataset.groupby('Group')[['yq', 'Value1']].plot(x = 'yq', kind='bar')

После этого я попытался нарисовать с его помощью линейный график.

fig, ax1 = plt.subplots(figsize=(7, 5))
ax2 = ax1.twinx()
dataset[['Value1', 'yq', 'Group']].groupby('Group').plot(x = 'yq', kind='bar', color='y', ax=ax1)
dataset[['Value2', 'yq', 'Group']].groupby('Group').plot(x = 'yq', kind='line', marker='d', ax=ax2)
ax1.yaxis.tick_right()
ax2.yaxis.tick_left()

Однако сюжет странный. Неправильно отображаются все метки по оси x. Чтобы быть кратким. он просто показывает год, а не год и квартал.
Кроме того, график не строит на нем гистограмму.

Любое предложение?

Я также пробовал:

fig, ax = plt.subplots(figsize=(10, 5))
dataset[['Value1', 'yq', 'Group']].plot(x = 'yq', kind='bar', stacked=False, title='get_title', color='grey', ax=ax, grid=False)
ax2 = ax.twinx()
ax2.plot(ax.get_xticks(), dataset[['Value2']].values, linestyle='-', marker='o', color='k', linewidth=1.0, label='percentage')
lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax.legend(lines + lines2, labels + labels2, loc='best')
ax.yaxis.set_ticks_position("right")
ax2.yaxis.set_ticks_position("left")
fig.autofmt_xdate()
plt.show()

Этот график неверен, но может отображать линию и столбец на одном графике.

Ваш код сработал у меня. Я получил год и квартал как метки оси x.

iamchoosinganame 30.05.2019 21:04

У меня работает нормально. Убедитесь, что yq не является типом datetime. Это объединит гистограммы и линейные графики.

Quang Hoang 30.05.2019 21:06
type(dataset.yq); pandas.core.series.Series
Peter Chen 30.05.2019 21:09

Попробуйте dataset.yq.dtype

Quang Hoang 30.05.2019 21:13

Один отсутствует [ в наборе данных ['Value2', 'yq', 'Group']]

Sheldore 30.05.2019 21:13

@QuangHoang dataset.yq.dtype; period[Q-DEC]

Peter Chen 30.05.2019 21:23

@Sheldore по-прежнему не показывает гистограмму на том же графике.

Peter Chen 30.05.2019 21:24

Период — дата и время.

Quang Hoang 30.05.2019 21:25

почему график не отображается должным образом по оси x с типом datetime?

Peter Chen 30.05.2019 21:26

просто любопытно, почему вы используете data.groupby? Только для разных цветов?

Quang Hoang 30.05.2019 22:00

@QuangHoang да. просто сделайте их разноцветными

Peter Chen 30.05.2019 22:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
11
5 047
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что bar plot устанавливает ось x на range(len(dataset)) и использует соответствующие метки, а line plot этого не делает. Таким образом, вы можете изменить yq на строку и использовать seaborn:

dataset.yq = dataset.yq.astype(str)

fig, ax1 = plt.subplots(figsize=(7,5))
ax2=ax1.twinx()
sns.barplot(x='yq', y='Value1', data=dataset, hue='Group',ax=ax1)
sns.lineplot(x='yq',y='Value2', data=dataset, hue='Group', marker='d', ax=ax2)
plt.show()

дает:

отличный! Можно ли установить метку оси x по вертикали или угол 45, а по оси y гистограммы установить процентное значение и показать ее на каждом столбце?

Peter Chen 30.05.2019 22:14
seaborn это круто. Но почему matplotlib не может завершить это?
Peter Chen 30.05.2019 22:21

метка процента возможна с: ax1.set_yticklabels(['{:.1f}%'.format(a*100) for a in ax1.get_yticks()]). Аннотировать гистограмму сложно, вы можете найти решение на этом сайте. matplotlib может, но требует большой доработки, что и делает seaborn, потому что (я думаю) seaborn — это просто оболочка для matplotlib.

Quang Hoang 30.05.2019 22:25

И можно ли сделать метку оси x вертикальной, потому что она немного тесновата

Peter Chen 30.05.2019 22:38
ax1.set_xticklabels(ax1.get_xticks(), rotation=90)
Quang Hoang 30.05.2019 23:44

Другие вопросы по теме