webentwicklung-frage-antwort-db.com.de

Wie wird der Maximalwert im Pyplot automatisch kommentiert?

Ich versuche herauszufinden, wie ich den Maximalwert in einem Figurenfenster automatisch mit Anmerkungen versehen kann. Ich weiß, dass Sie dies tun können, indem Sie manuell in x, y-Koordinaten eingeben, um den gewünschten Punkt mit der .annotate()-Methode zu kommentieren, aber ich möchte, dass die Annotation automatisch ist oder den maximalen Punkt selbst ermittelt.

Hier ist mein Code bisher:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas import Series, DataFrame

df = pd.read_csv('macrodata.csv') #Read csv file into dataframe
years = df['year'] #Get years column
infl = df['infl'] #Get inflation rate column

fig10 = plt.figure()
win = fig10.add_subplot(1,1,1)
fig10 = plt.plot(years, infl, lw = 2)

fig10 = plt.xlabel("Years")
fig10 = plt.ylabel("Inflation")
fig10 = plt.title("Inflation with Annotations")

Here's the figure that it generates

4
shadewolf

Ich habe keine Daten von macrodata.csv, um mit zu gehen. Wenn Sie jedoch x- und y-Achsendaten als Liste verwenden, können Sie die folgende Methode verwenden, um die automatische Positionierung von max abzurufen.

Arbeitscode:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

x=[1,2,3,4,5,6,7,8,9,10]
y=[1,1,1,2,10,2,1,1,1,1]
line, = ax.plot(x, y)

ymax = max(y)
xpos = y.index(ymax)
xmax = x[xpos]

ax.annotate('local max', xy=(xmax, ymax), xytext=(xmax, ymax+5),
            arrowprops=dict(facecolor='black', shrink=0.05),
            )

ax.set_ylim(0,20)
plt.show()

Handlung :
 enter image description here

10
Anil_M

Wenn x und y die zu zeichnenden Arrays sind, erhalten Sie die Koordinaten des Maximums via 

xmax = x[numpy.argmax(y)]
ymax = y.max()

Dies kann in eine Funktion integriert werden, die Sie einfach mit Ihren Daten aufrufen können.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2,8, num=301)
y = np.sinc((x-2.21)*3)


fig, ax = plt.subplots()
ax.plot(x,y)

def annot_max(x,y, ax=None):
    xmax = x[np.argmax(y)]
    ymax = y.max()
    text= "x={:.3f}, y={:.3f}".format(xmax, ymax)
    if not ax:
        ax=plt.gca()
    bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
    arrowprops=dict(arrowstyle="->",connectionstyle="angle,angleA=0,angleB=60")
    kw = dict(xycoords='data',textcoords="axes fraction",
              arrowprops=arrowprops, bbox=bbox_props, ha="right", va="top")
    ax.annotate(text, xy=(xmax, ymax), xytext=(0.94,0.96), **kw)

annot_max(x,y)


ax.set_ylim(-0.3,1.5)
plt.show()

 enter image description here

So etwas würde funktionieren:

infl_max_index = np.where(infl == max(infl)) #get the index of the maximum inflation
infl_max = infl[infl_max_index] # get the inflation corresponding to this index
year_max = year[infl_max_index] # get the year corresponding to this index

plt.annotate('max inflation', xy=(year_max, infl_max))
0
Alex