У меня есть два набора данных, каждый из которых охватывает одну неделю. z1
— от 2022-02-07
до 2022-02-14
, а z2
— от 2022-01-31
до 2022-02-07
. Таким образом, они оба начинаются в понедельник и заканчиваются в следующий понедельник.
Я хочу построить z1
и z2
, чтобы они имели одни и те же оси x и y, а метки xticklabels отображали Mon
, Tue
и т. д. Как мне это сделать?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
z1 = pd.DataFrame(data = {'datetime': pd.date_range(start='2022-02-07',end='2022-02-14',freq='1H'), 'data1': np.random.randint(5,40,size=337)})
z1 = z1.set_index('datetime')
z1['day'] = z1.index.day_name()
z2 = pd.DataFrame(data = {'datetime': pd.date_range(start='2022-01-31',end='2022-02-07',freq='1H'), 'data2': np.random.randint(22,31,size=337)})
z2 = z2.set_index('datetime')
z2['day'] = z2.index.day_name()
plt.figure(figsize=(14,6))
ax = plt.subplot(111)
ax2 = ax.twinx()
z1.plot(ax=ax, label='this week', lw=2, color='b', x_compat=True)
z2.plot(ax=ax2, label='last week', lw=2, color='r', x_compat=True)
# ax.plot(z1['day'], z1['data1'], label='this week', lw=2, color='b')
# ax2.plot(z2['day'], z2['data2'], label='last week', lw=2, color='r')
ax.xaxis.set_major_locator(mdates.DayLocator())
xfmt = mdates.DateFormatter('%a')
ax.xaxis.set_major_formatter(xfmt)
ax.tick_params(axis = "x", rotation=0)
ax.legend()
ax2.legend()
plt.show()
но я хочу это:
да, это работает, но я надеюсь найти более элегантное решение - вместо того, чтобы строить график двух недель подряд, как в моем MWE, мне, возможно, придется сравнивать две недели с разницей в год и т. д., поэтому я не заинтересован в необходимости отрегулировать смещение вручную...
Определите новый столбец day_hour, подобный этому z1['day_hour'] = z1.index.day_name() + z1.index.hour.astype(str)
, как для z1, так и для z2. Затем объедините два df и постройте zmerged. Как-то так zmerged = z1.merge(z2)
Я не думаю, что можно сделать один график для каждого из графиков панд, поскольку они имеют разные индексы. Используя matplotlib, ось X должна представлять собой непрерывные данные с использованием количества точек данных. После создания графика установите_xticks на 24 тиковых точки, где меняется день недели. set_xticklabels, чтобы использовать день недели любого фрейма данных и использовать его в качестве метки тика для каждого из 24 тиков.
fig, ax = plt.subplots(figsize=(14,6))
ax = plt.subplot(111)
ax2 = ax.twinx()
ax.plot(np.arange(169), z1['data1'], label='this week', lw=2, color='b')
ax2.plot(np.arange(169), z2['data2'], label='last week', lw=2, color='r')
ax.set_xticks(np.arange(0,169,24))
ax.set_xticklabels(z1.day[::24])
ax.tick_params(axis = "x", rotation=0)
fig.legend(bbox_to_anchor=(0.12, 0.12, 0.1, 0.1))
plt.show()
возможно, смещение индекса должно помочь?
z1.index -= pd.DateOffset(days=7)
; затем заговор