sha*_*olf 6 python numpy matplotlib pandas
我试图找出如何自动注释图窗口中的最大值.我知道你可以通过手动输入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")
Run Code Online (Sandbox Code Playgroud)

Imp*_*est 20
如果x和y是要绘制的数组,则获得最大通道的坐标
xmax = x[numpy.argmax(y)]
ymax = y.max()
Run Code Online (Sandbox Code Playgroud)
这可以合并到您可以简单地使用您的数据调用的函数中.
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()
Run Code Online (Sandbox Code Playgroud)
Ani*_*l_M 13
我没有数据macrodata.csv可供选择.然而,一般,假设你有x和y轴数据作为一个列表,你可以用下面的方法来获得自动定位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()
Run Code Online (Sandbox Code Playgroud)
@ImportanceOfBeingErnest 在他的回复中提出的方法非常简洁,但如果数据位于索引不是基于零的统一索引([0,1,2,.., N]),并且需要针对索引(其值为 x 的)进行绘图。
我冒昧地改编了上述解决方案并将其与 pandasplot功能一起使用。我还写了对称min函数。
def annot_max(x,y, ax=None):
maxIxVal = np.argmax(y);
zeroBasedIx = np.argwhere(y.index==maxIxVal).flatten()[0];
xmax = x[zeroBasedIx];
ymax = y.max()
text= "k={:d}, measure={:.3f}".format(xmax, ymax)
if not ax:
ax=plt.gca()
bbox_props = dict(boxstyle="round,pad=0.3", fc="w", ec="k", lw=0.72)
arrowprops=dict(arrowstyle="-",connectionstyle="arc3,rad=0.1")
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.90), **kw)
def annot_min(x,y, ax=None):
minIxVal = np.argmin(y);
zeroBasedIx = np.argwhere(y.index==minIxVal).flatten()[0];
xmin = x[zeroBasedIx];
ymin = y.min()
text= "k={:d}, measure={:.3f}".format(xmin, ymin)
if not ax:
ax=plt.gca()
bbox_props = dict(boxstyle="round,pad=0.3", fc="w", ec="k", lw=0.72)
arrowprops=dict(arrowstyle="-",connectionstyle="arc3,rad=0.1")
kw = dict(xycoords='data',textcoords="axes fraction",
arrowprops=arrowprops, bbox=bbox_props, ha="right", va="top")
ax.annotate(text, xy=(xmin, ymin), xytext=(0.94,0.90), **kw)
Run Code Online (Sandbox Code Playgroud)
用法很简单,例如:
ax = df[Series[0]].plot(grid=True, use_index=True, \
title=None);
annot_max(df[Series[0]].index,df[Series[0]],ax);
plt.show();
Run Code Online (Sandbox Code Playgroud)
我希望这对任何人都有帮助。
| 归档时间: |
|
| 查看次数: |
28687 次 |
| 最近记录: |