подстрочные и линейные графики pandas с datetime и sharex

#python #datetime #matplotlib #bar-chart #linechart

#python #datetime #matplotlib #гистограмма #линейная диаграмма

Вопрос:

Я хочу создать фигуру с двумя подзаголовками, в которых используется sharex с типом datetime.

  • подзаголовок 1: линейный график из фрейма данных
  • подзаголовок 2: график со сложенными столбцами из фрейма данных

По некоторым причинам и после множества испытаний (в том числе с использованием matplotlib.pyplot напрямую вместо pandas plot) Я не могу заставить этот микс работать.

Использование sharex и datetime, по-видимому, несовместимо с сочетанием штриховых и линейных графиков :

 import matplotlib.pyplot as plt
import datetime as dt
import pandas as pd
import numpy as np

x = pd.date_range(dt.datetime(2020,1,1), periods = 5, freq = 'H')
y = np.random.randint(0,4,(5,3))

df = pd.DataFrame(index = x,data = y)

fig, axes = plt.subplots(nrows = 2, sharex = True)
#fig.autofmt_xdate() 
df.sum(axis=1).plot(ax=axes[0])
df.plot(kind='bar',stacked=True,ax=axes[1])
  

Результат кода

Ось x линейного графика правильно интерпретируется как тип datetime, однако гистограмма нет, как показано в следующем примере :

 import matplotlib.pyplot as plt
import datetime as dt
import pandas as pd
import numpy as np

x = pd.date_range(dt.datetime(2020,1,1), periods = 5, freq = 'H')
y = np.random.randint(0,4,(5,3))

df = pd.DataFrame(index = x,data = y)

fig, axes = plt.subplots(nrows = 2)
#fig.autofmt_xdate()
df.sum(axis=1).plot(ax=axes[0])
df.plot(kind='bar',stacked=True,ax=axes[1])

print('x-limits :')
print(axes[0].get_xlim())
print(axes[1].get_xlim())
  

xlim выходит с (438288.0, 438292.0) и (-0.5, 4.5).

Затем я попытался обмануть xticks и xlim обоих подзаголовков, чтобы они были эквивалентны, но на рисунке перестало отображаться что-либо значимое (с активным sharex или нет):

 axes[0].set_xticks(x)
axes[1].set_xticks(x)
axes[1].set_xticks(axes[1].get_xticks()*24)
axes[0].set_xlim([axes[0].get_xticks()[0],axes[0].get_xticks()[-1]])
axes[1].set_xlim([axes[0].get_xticks()[0],axes[0].get_xticks()[-1]])
print('x-ticks and xlim after modifications:')
print(axes[0].get_xticks())
print(axes[1].get_xticks()) 
print(axes[0].get_xlim())
print(axes[1].get_xlim())
  

Возможно ли вообще сочетание графика со столбчатым и линейным графиком с использованием sharex datetime?

Комментарии:

1. df.plot(kind='bar') на самом деле данные сопоставляются range(len(df)) с данными и соответствующим образом помечаются datetime.

2. Чтобы развить предыдущий комментарий, диаграммы столбцов разработаны вокруг категориальных, а не временных осей