График рассеяния и кривой с использованием matplotlib

#python #pandas #matplotlib #scatter-plot

#python #панды #matplotlib #график рассеяния

Вопрос:

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

 import pandas as pd

data = pd.read_excel (r'SOTA DNN.xlsx')
acc1 = pd.DataFrame(data, columns= ['Top-1-Acc'])
para = pd.DataFrame(data, columns= ['Parameters'])
dates = pd.to_datetime(data['Date'], format='%Y-%m-%d')

import matplotlib.pyplot as plt
plt.grid(True)
plt.ylim(40, 100)
plt.scatter(dates, acc1)
plt.show()
  

введите описание изображения здесь

Есть ли способ нарисовать линию на том же рисунке, чтобы показать только те, которые достигают максимума, и напечатать их имена одновременно, как в этом примере:
введите описание изображения здесь
возможно ли также растянуть ось x (для дат)?

Ответ №1:

До сих пор неясно, что вы подразумеваете под «растягиванием оси x», и вы не предоставили свой набор данных, но вот возможный общий подход:

 import matplotlib.pyplot as plt
import pandas as pd

#fake data generation, this has to be substituted by your .xls import routine
from pandas._testing import rands_array
import numpy as np
np.random.seed(1234)
n = 30
acc = np.concatenate([np.random.randint(0, 10, 10), np.random.randint(0, 30, 10), np.random.randint(0, 100, n-20)])
date_range = pd.date_range("20190101", periods=n)
model = rands_array(5, n)
df = pd.DataFrame({"Model": model, "Date": date_range, "TopAcc": acc})
df = df.sample(frac=1).reset_index(drop=True)


#now to the actual data modification
#first, we extract the dataframe with monotonically increasing values after sorting the date column
df = df.sort_values("Date").reset_index()
df["Max"] = df.TopAcc.cummax().diff()
df.loc[0, "Max"] = 1
dfmax = df[df.Max > 0]

#then, we plot all data, followed by the best performers
fig, ax = plt.subplots(figsize=(10, 5))
ax.scatter(df.Date, df.TopAcc, c="grey")
ax.plot(dfmax.Date, dfmax.TopAcc, marker="x", c="blue")

#finally, we annotate the best performers
for _, xylabel in dfmax.iterrows():
        ax.text(xylabel.Date, xylabel.TopAcc, xylabel.Model, c="blue", horizontalalignment="right", verticalalignment="bottom")

plt.show()
  

Пример вывода:

введите описание изображения здесь