如何使用python和matplotlib注释行的结尾?

如何使用python和matplotlib注释行的结尾?,python,matplotlib,Python,Matplotlib,使用数据帧和基本绘图,例如: import pandas as pd import numpy as np import matplotlib.pyplot as plt np.random.seed(123456) rows = 75 df = pd.DataFrame(np.random.randint(-4,5,size=(rows, 3)), columns=['A', 'B', 'C']) datelist = pd.date_range(pd.datetime(2017, 1, 1

使用数据帧和基本绘图,例如:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(123456)
rows = 75
df = pd.DataFrame(np.random.randint(-4,5,size=(rows, 3)), columns=['A', 'B', 'C'])
datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
df['dates'] = datelist 
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
df = df.cumsum()

df.plot()

注释直线上最后一点的最佳方法是什么,以便获得下面的结果


方法1

这里有一种方法,或者至少是一种方法,您可以使用
plt.annotate
方法,以任何方式调整它,使其在美学上符合您的要求:

[编辑]:如果要使用第一种方法,那么ImportanceOfBeingErnest的答案中列出的方法比我建议的要好

df.plot()

for col in df.columns:
    plt.annotate(col,xy=(plt.xticks()[0][-1]+0.7, df[col].iloc[-1]))

plt.show()

对于
xy
参数,即文本的x和y坐标,我选择了
plt.xticks()
中的最后一个x坐标,并添加了0.7,使其位于x轴之外,但您可以根据需要使其更近或更远

方法2

您也可以使用正确的y轴,并用三条线标记它。例如:

fig, ax = plt.subplots()
df.plot(ax=ax)
ax2 = ax.twinx()
ax2.set_ylim(ax.get_ylim())
ax2.set_yticks([df[col].iloc[-1] for col in df.columns])
ax2.set_yticklabels(df.columns)

plt.show()
这将为您提供以下绘图:


要注释点,请使用
ax.annotate()
。在这种情况下,指定要单独注释的坐标是有意义的。也就是说,y坐标是直线最后一点的数据坐标(可以从
line.getydata()[-1]
),而x坐标独立于数据,应该是轴的右侧(即轴坐标中的
1
)。然后,您可能还希望稍微偏移文本,使其不会与轴重叠

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

rows = 75
df = pd.DataFrame(np.random.randint(-4,5,size=(rows, 3)), columns=['A', 'B', 'C'])
datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
df['dates'] = datelist 
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
df = df.cumsum()

ax = df.plot()

for line, name in zip(ax.lines, df.columns):
    y = line.get_ydata()[-1]
    ax.annotate(name, xy=(1,y), xytext=(6,0), color=line.get_color(), 
                xycoords = ax.get_yaxis_transform(), textcoords="offset points",
                size=14, va="center")

plt.show()

你有没有尝试过?过去在电视上有一个很好的例子。我现在似乎找不到它,但可以随意浏览。我做了一些我觉得不值得一提的微弱尝试。谢谢你的提示和链接!谢谢你的回答!颜色的触感很好!您可以移除脊椎以获得更好的效果。好主意。没错,那样看起来会更好<代码>ax2。勾选参数(长度=0)即可。