У меня есть такие данные:
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()
Этот график неверен, но может отображать линию и столбец на одном графике.
У меня работает нормально. Убедитесь, что yq
не является типом datetime
. Это объединит гистограммы и линейные графики.
type(dataset.yq); pandas.core.series.Series
Попробуйте dataset.yq.dtype
Один отсутствует [
в наборе данных ['Value2', 'yq', 'Group']]
@QuangHoang dataset.yq.dtype; period[Q-DEC]
@Sheldore по-прежнему не показывает гистограмму на том же графике.
Период — дата и время.
почему график не отображается должным образом по оси x с типом datetime
?
просто любопытно, почему вы используете data.groupby
? Только для разных цветов?
@QuangHoang да. просто сделайте их разноцветными
Проблема в том, что 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 гистограммы установить процентное значение и показать ее на каждом столбце?
seaborn
это круто. Но почему matplotlib
не может завершить это?
метка процента возможна с: ax1.set_yticklabels(['{:.1f}%'.format(a*100) for a in ax1.get_yticks()])
. Аннотировать гистограмму сложно, вы можете найти решение на этом сайте. matplotlib
может, но требует большой доработки, что и делает seaborn
, потому что (я думаю) seaborn
— это просто оболочка для matplotlib
.
И можно ли сделать метку оси x вертикальной, потому что она немного тесновата
ax1.set_xticklabels(ax1.get_xticks(), rotation=90)
Ваш код сработал у меня. Я получил год и квартал как метки оси x.