如何在pyplot中自动标注最大值

新手上路,请多包涵

我想弄清楚如何在图形窗口中自动注释最大值。我知道您可以通过手动输入 x、y 坐标来使用 .annotate() 方法注释您想要的任何点来做到这一点,但我希望注释是自动的,或者自己找到最大点。

到目前为止,这是我的代码:

 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")

这是它生成的数字

原文由 shadewolf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

我没有 macrodata.csv 的数据。但是,一般来说,假设您有 xy 轴数据作为列表,您可以使用以下方法来自动定位 max

工作代码:

 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()

阴谋 :

在此处输入图像描述

原文由 Anil_M 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果 xy 是要绘制的数组,您可以通过以下方式获得最大值的坐标

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

这可以合并到一个函数中,您可以简单地用您的数据调用该函数。

 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()

在此处输入图像描述

原文由 ImportanceOfBeingErnest 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题