使用matplotlib显示每条线的最终y轴值

7
我正在使用matplotlib绘制一些线条的图表,并希望在每条线条的右侧显示最终的y值,就像这样: enter image description here 有什么解决方案或指向相关API部分的指针吗?我很困惑。
我正在使用matplotlib 1.0.0和pyplot接口,例如pyplot.plot(xs, ys, f, xs_, ys_, f_)

感谢您进行图像嵌入编辑! - PAG
3个回答

30

虽然Ofri的回答没有错,但annotate特别用于此目的:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(61).astype(np.float)
y1 = np.exp(0.1 * x)
y2 = np.exp(0.09 * x)

plt.plot(x, y1)
plt.plot(x, y2)

for var in (y1, y2):
    plt.annotate('%0.2f' % var.max(), xy=(1, var.max()), xytext=(8, 0), 
                 xycoords=('axes fraction', 'data'), textcoords='offset points')

plt.show()

输入图像描述

这将在每个图的最大y值处,使文本相对于轴右侧偏移8个。如果您需要在给定y值上垂直居中文本,则还可以添加箭头等内容。请参阅http://matplotlib.sourceforge.net/users/annotations_guide.html (如果指定va='center',还可以更改垂直对齐方式)。此外,这不依赖于刻度位置,因此对于对数图等情况也能完美工作。通过以轴边界的位置和其点偏移量来确定文本位置,在重新缩放绘图等情况下有很多优势。


在处理这个特定的例子时,此解决方案假定值是递增的,并且最终值等于最大值。如果确实想要最终值,请使用: plt.annotate('%0.2f' % var[-1], xy=(1, var.max()), xytext=(8, 0), xycoords=('axes fraction', 'data'), textcoords='offset points') - Frumda Grayforce

9

Option 1 - pyplot.text

pyplot.text(x, y, string, fontdict=None, withdash=False, **kwargs)

选项2 - 使用第二个坐标轴

second_axes = pyplot.twinx() # create the second axes, sharing x-axis
second_axis.set_yticks([0.2,0.4]) # list of your y values
pyplot.show() # update the figure

第一个选项可以完成工作(大多数情况下,请参见我上面的评论),但我真的很喜欢第二个选项!必须手动设置相同的轴格式化程序,但这没有问题。谢谢! - PAG
1
然而,当y轴为对数刻度时,它会遇到一些困难。数字的绘制好像新的坐标轴不存在。如果第二个y轴也设置为对数刻度,则数字不会被绘制。 - PAG

4
非常有用,Joe。只有一个细节需要注意。如果最终值不是最大值,您可以使用 y[-1]。我添加了一条水平线以澄清。
gbm = np.log(np.cumsum(np.random.randn(10000))+10000)
plt.plot(gbm)
plt.annotate('%0.2f' % gbm[-1], xy=(1, gbm[-1]), xytext=(8, 0), 
             xycoords=('axes fraction', 'data'), textcoords='offset points')
plt.axhline(y=gbm[-1], color='y', linestyle='-.')
plt.show()

标有最终y轴值的图表。


如何在数据框中按组分配值? - Peter Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接