Как управлять датами по оси X в Matplotlib?

Хорошо, я работал над данными временных рядов температуры и хочу знать, есть ли способ контролировать даты на оси X. Matplotlib случайным образом выбирает даты для оси X. Я имею в виду, что я хотел показать точную дату под аномалией, а затем назвать ее EQ, а другие значения установить как количество дней до и после EQ.

например, ось X может иметь вид [-25, -20, -15, -10, -5, "EQ", 5, 10]

Вот данные, с которыми я сейчас работаю:

данные

Вот чего я хочу достичь.

и вот код, который я написал на данный момент!

fig, ax = plt.subplots(figsize=(8,4))

sns.scatterplot(data =at_day, x=at_day.index, y = "AT_Day_Time_Values", hue=at_day["Legend"], palette = "bright", s = 80);
sns.lineplot(at_day["AT_Day_Time_Values"], linewidth=1.5, linestyle = "--", color = "black", ax = ax, label = "AT (Day)")
sns.rugplot(data =at_day, x=at_day.index, y = "AT_Day_Time_Values", hue=at_day["Legend"],  ax= ax)

ax.set_xticks(at_day.index.date)

ax.xaxis.set_major_locator(mdates.DayLocator(interval=5))
ax.set(ylim=[295, 307], ylabel = "K");
ax.grid(axis = "y")

Пожалуйста, пока игнорируйте другие вещи, такие как оттенок и тому подобное. Меня интересует только научиться контролировать даты на оси x.

ax.set_xticks принимает аргумент labels, который вы можете использовать для изменения того, что он говорит на каждом тике.
jared 05.05.2024 23:34

да, но matplotlib выбирает даты случайным образом со смещением в 7 дней между датами. Я хотел знать, есть ли способ установить конкретную отправную точку для дат по оси X?

Imtiaz Nabi 05.05.2024 23:58

Передайте ax.set_xticks конкретные даты, которые вы хотите отметить (а не все даты, как вы сейчас делаете), и передайте аргументу labels список того, что вы хотите, чтобы он на самом деле говорил.

jared 06.05.2024 01:15
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

С помощью этого подхода вы можете автоматически генерировать тики. Я предполагал, что вам всегда нужна разница в 5 дней, поэтому здесь вы также можете изменить это позже, если хотите:

import pandas as pd
import numpy as np
%matplotlib notebook
import matplotlib.pyplot as plt
df = pd.read_csv("air_temp.csv")
df["Dates"] = pd.to_datetime(df["Dates"])
# get limits for prompt
minDate = df["Dates"].min()
maxDate = df["Dates"].max()
EQ = "" # init
while EQ not in df["Dates"].values: # check value, do until...
    # prompt user to input dates between two values, liek t his yyyy-mm-dd
    EQ = input(f"Choose a date between {minDate.date()} and {maxDate.date()}: ")
    EQ = pd.to_datetime(EQ) # convert to date
df['DatesDiff'] = df['Dates'] - EQ # get time difference
plt.figure() # generate a figure
plt.plot(df['DatesDiff'].dt.days, df['AT_Day_Time_Values']) # plot
minVal = np.floor(min(df["DatesDiff"].dt.days) / 5) * 5 # get suitable limit in negative
maxVal = np.ceil(max(df["DatesDiff"].dt.days) / 5) * 5 # get suitable limit in positive
ticks = np.arange(minVal, maxVal + 1, 5) # define the ticks you want to set, they will include 0 and have 5 spacing
labels = [str(int(tick)) if tick != 0 else 'EQ' for tick in ticks] # generate labels as string, with "EQ" at 0
plt.xticks(ticks, labels) # set the ticks
plt.title("EQ = "+str(EQ.date())) # set title for OP

Это с EQ: 2022-08-05

Я думаю, вы хотели бы автоматически идентифицировать пик, поэтому вот как это сделать:

df = pd.read_csv("air_temp.csv")
df["Dates"] = pd.to_datetime(df["Dates"])
# get limits for prompt
minDate = df["Dates"].min()
maxDate = df["Dates"].max()
EQ = df["Dates"].loc[df["AT_Day_Time_Values"].idxmax()] # get maximum temp
df["DatesDiff"] = df["Dates"] - EQ # get time difference
plt.figure() # generate a figure
plt.plot(df["DatesDiff"].dt.days, df["AT_Day_Time_Values"]) # plot
minVal = np.floor(min(df["DatesDiff"].dt.days) / 5) * 5 # get suitable limit in negative
maxVal = np.ceil(max(df["DatesDiff"].dt.days) / 5) * 5 # get suitable limit in positive
ticks = np.arange(minVal, maxVal + 1, 5) # define the ticks you want to set, they will include 0
labels = [str(int(tick)) if tick != 0 else 'EQ' for tick in ticks] # generate labels as string, with "EQ" at 0
plt.xticks(ticks, labels) # set the ticks
plt.title("EQ = "+str(EQ.date())) # set title for OP

Я думаю, поскольку на этот раз это максимум, это было легко. Обнаружение аномалии усложнится, когда данные станут еще более зашумленными. Вот результат:

Спасибо, это очень близко, но на самом деле землетрясение произошло 27 числа, и это предсейсмическая аномалия.

Imtiaz Nabi 06.05.2024 21:25

с моей точки зрения, моего ответа на ваш вопрос достаточно, поскольку речь в основном идет об изменении x-тиков. Обнаружение эквалайзера может стать темой для другого вопроса, если у вас возникли проблемы с его обнаружением.

Tino D 06.05.2024 21:41

@ImtiazNabi 2- вы можете использовать первый подход, чтобы вручную указать дату для получения желаемых результатов.

Tino D 06.05.2024 21:42

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