在ipython笔记本中添加一个任意的线到matplotlib图

我对python / matplotlib都比较陌生,通过ipython笔记本来使用它。 我试图添加一些注释行到现有的graphics,我无法弄清楚如何呈现graphics上的线条。 所以,例如,如果我绘制以下内容:

import numpy as np np.random.seed(5) x = arange(1, 101) y = 20 + 3 * x + np.random.normal(0, 60, 100) p = plot(x, y, "o") 

我得到以下图表:

美丽的散点图

那么我如何增加一个从(70,100)到(70,250)的垂直线呢? 从(70,100)到(90,200)的对angular线呢?

我用Line2D()尝试了几件事情,结果导致了我的困惑。 在R我会简单地使用segments()函数,这将添加线段。 在matplotlib有一个等价的?

您可以通过inputplot命令和相应的数据(片段的边界)直接绘制所需的线条:

plot([x1, x2], [y1, y2], color='k', linestyle='-', linewidth=2)

(当然你可以select颜色,线条宽度,线条样式等)

从你的例子:

 import numpy as np import matplotlib.pyplot as plt np.random.seed(5) x = np.arange(1, 101) y = 20 + 3 * x + np.random.normal(0, 60, 100) plt.plot(x, y, "o") # draw vertical line from (70,100) to (70, 250) plt.plot([70, 70], [100, 250], 'k-', lw=2) # draw diagonal line from (70, 90) to (90, 200) plt.plot([70, 90], [90, 200], 'k-') plt.show() 

新图表

对于新来者来说,还为时不晚。

 plt.axvline(x, color='r') 

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axvline

它也取y的范围,使用ymin和ymax。

使用vlines

 import numpy as np np.random.seed(5) x = arange(1, 101) y = 20 + 3 * x + np.random.normal(0, 60, 100) p = plot(x, y, "o") vlines(70,100,250) 

基本的呼叫签名是:

 vlines(x, ymin, ymax) hlines(y, xmin, xmax) 

Matplolib现在允许OP正在寻找“注释行”。 annotate()函数允许多种forms的连接path,而无头和无尾箭头(即简单的一行)就是其中之一。

 ax.annotate("", xy=(0.2, 0.2), xycoords='data', xytext=(0.8, 0.8), textcoords='data', arrowprops=dict(arrowstyle="-", connectionstyle="arc3, rad=0"), ) 

在文档中说,你可以只绘制一个空string作为第一个参数的箭头。

从OP的例子来看:

 %matplotlib notebook import numpy as np import matplotlib.pyplot as plt np.random.seed(5) x = np.arange(1, 101) y = 20 + 3 * x + np.random.normal(0, 60, 100) plt.plot(x, y, "o") # draw vertical line from (70,100) to (70, 250) plt.annotate("", xy=(70, 100), xycoords='data', xytext=(70, 250), textcoords='data', arrowprops=dict(arrowstyle="-", connectionstyle="arc3,rad=0."), ) # draw diagonal line from (70, 90) to (90, 200) plt.annotate("", xy=(70, 90), xycoords='data', xytext=(90, 200), textcoords='data', arrowprops=dict(arrowstyle="-", connectionstyle="arc3,rad=0."), ) plt.show() 

示例内联图像

就像在gcalmettes的答案中的方法一样,你可以select颜色,线宽,线条样式等。

这是一个代码的一部分,将使两个示例行中的一个变红,更宽,而不是100%不透明。

 # draw vertical line from (70,100) to (70, 250) plt.annotate("", xy=(70, 100), xycoords='data', xytext=(70, 250), textcoords='data', arrowprops=dict(arrowstyle="-", edgecolor = "red", linewidth=5, alpha=0.65, connectionstyle="arc3,rad=0."), ) 

您还可以通过调整connectionstyle将曲线添加到连接线。