#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. Чтобы развить предыдущий комментарий, диаграммы столбцов разработаны вокруг категориальных, а не временных осей