Отображение двухнедельных данных временных рядов панд на одной оси в matplotlib

У меня есть два набора данных, каждый из которых охватывает одну неделю. 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()

Отображение двухнедельных данных временных рядов панд на одной оси в matplotlib

но я хочу это:

Отображение двухнедельных данных временных рядов панд на одной оси в matplotlib

возможно, смещение индекса должно помочь? z1.index -= pd.DateOffset(days=7); затем заговор

enke 17.03.2022 01:28

да, это работает, но я надеюсь найти более элегантное решение - вместо того, чтобы строить график двух недель подряд, как в моем MWE, мне, возможно, придется сравнивать две недели с разницей в год и т. д., поэтому я не заинтересован в необходимости отрегулировать смещение вручную...

Medulla Oblongata 17.03.2022 01:38

Определите новый столбец day_hour, подобный этому z1['day_hour'] = z1.index.day_name() + z1.index.hour.astype(str), как для z1, так и для z2. Затем объедините два df и постройте zmerged. Как-то так zmerged = z1.merge(z2)

Pankaj Saini 17.03.2022 02:50
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я не думаю, что можно сделать один график для каждого из графиков панд, поскольку они имеют разные индексы. Используя 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()

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

Используйте Большие надежды для проверки pandas DataFrame с существующим набором JSON
Группа данных pandas по нескольким столбцам и подсчет различных значений
Лучший метод Pandas для сравнения двух фреймов данных и поиска записей, которые существуют только в одном
Как создать новый столбец на основе средней разницы между столбцами даты в фрейме данных?
Ошибка при запуске моей функции пространственного суммирования в текстовом столбце в фрейме данных pandas
Как использовать лямбда внутри функции
Получение следующего значения groupby после взрыва с пандами
Чтение определенных файлов из папки в Python
Список фреймов данных добавляет [] или фрейм данных считывает заголовок при прохождении цикла for. Как я могу заставить список работать в цикле for?
Объединить два кадра данных pandas с небольшим запасом ошибок для выбранного значения каждой строки?