Хорошо, я работал над данными временных рядов температуры и хочу знать, есть ли способ контролировать даты на оси 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.
да, но matplotlib выбирает даты случайным образом со смещением в 7 дней между датами. Я хотел знать, есть ли способ установить конкретную отправную точку для дат по оси X?
Передайте ax.set_xticks
конкретные даты, которые вы хотите отметить (а не все даты, как вы сейчас делаете), и передайте аргументу labels
список того, что вы хотите, чтобы он на самом деле говорил.
С помощью этого подхода вы можете автоматически генерировать тики. Я предполагал, что вам всегда нужна разница в 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 числа, и это предсейсмическая аномалия.
с моей точки зрения, моего ответа на ваш вопрос достаточно, поскольку речь в основном идет об изменении x-тиков. Обнаружение эквалайзера может стать темой для другого вопроса, если у вас возникли проблемы с его обнаружением.
@ImtiazNabi 2- вы можете использовать первый подход, чтобы вручную указать дату для получения желаемых результатов.
labels
, который вы можете использовать для изменения того, что он говорит на каждом тике.