在matplotlib中绘制垂直的双向箭头

时间:2018-08-22 23:42:28

标签: python-3.x matplotlib

我有以下绘图,显示线性关系(黑色)及其残差(蓝色)。红色虚线显示残差的上下边界,垂直红色线显示范围:

enter image description here

这是我对残差的边界进行编码的方式:

plt.hlines(y = max(model.resid), xmin = min(x), xmax = max(x),
               color = 'r', linestyle = 'dotted')
plt.hlines(y = min(model.resid), xmin = min(x), xmax = max(x),
               color = 'r', linestyle = 'dotted')
plt.vlines(label = 'Range of residuals: %g'%(max(model.resid) - min(model.resid)),
               x = min(x), ymin = min(model.resid), ymax = max(model.resid),
               color = 'r', linestyle = 'solid')

我希望垂直线是双箭头,所以我尝试在arrowprops = {'arrowstyle': '<->'}之后使用linestyle,但得到AttributeError: Unknown property arrowprops

我发现的所有问题和示例都显示了如何制作任意位置的箭头,但是没有一个箭头比例合理。

有没有简单的方法可以将线转换为双向箭头?

1 个答案:

答案 0 :(得分:0)

这是解决您问题的最小解决方案。此处的主要关键字是arrowstyle="<->"。我个人更喜欢单独使用plt.text来使文本独立于绘图中的箭头终点。它给您更多自由。由于您缺少数据,我不得不生成随机数据,但我保持xy的范围与您的相似。您可以相应地修改代码。您的问题是您正在将arrowprops的属性annotate分配给vlines

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot(111)

x = np.linspace(-0.4, 0.6, 1000)
y = np.random.normal(0, 0.033, 1000)

plt.plot(x, y, 'o')
plt.hlines(y = max(y), xmin = min(x), xmax = max(x),
               color = 'r', linestyle = 'dotted')
plt.hlines(y = min(y), xmin = min(x), xmax = max(x),
               color = 'r', linestyle = 'dotted')

ax.annotate("",
            xy=(min(x), min(y)), xycoords='data',
            xytext=(min(x), max(y)), textcoords='data',
            arrowprops=dict(arrowstyle="<->",
                            connectionstyle="arc3", color='r', lw=2),
            )

plt.text(1.2*min(x), max(y), 'Range of residuals: %g'%(max(y) - min(y)), 
         rotation = 90, fontsize = 16)
plt.xlim(1.3*min(x), 1.3*max(x))

输出

enter image description here