使用matplotlib绘制水平线


130

我使用样条插值法来平滑时间序列,并且还想在绘图中添加一条水平线。但是似乎有一个我无法控制的问题。任何帮助都会非常有帮助。这是我所拥有的:

annual = np.arange(1,21,1)
l = np.array(value_list) # a list with 20 values
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)
plt.plot(xs,spl(xs),'b')

plt.plot([0,len(xs)],[40,40],'r--',lw=2)
pylab.ylim([0,200])
plt.show()

问题似乎与我[0,len(xs)]对水平线图的使用有关。

Answers:


5

你是对的,我认为这使[0,len(xs)]你失望了。您将要重用原始的x轴变量,xs并使用另一个包含变量的相同长度的numpy数组对其进行绘制。

annual = np.arange(1,21,1)
l = np.array(value_list) # a list with 20 values
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)
plt.plot(xs,spl(xs),'b')

#####horizontal line
horiz_line_data = np.array([40 for i in xrange(len(xs))])
plt.plot(xs, horiz_line_data, 'r--') 
###########plt.plot([0,len(xs)],[40,40],'r--',lw=2)
pylab.ylim([0,200])
plt.show()

希望可以解决问题!


19
这行得通,但并不是特别有效,尤其是当您根据数据创建可能非常大的数组时。如果您要以这种方式进行操作,则拥有两个数据点,一个在起点,一个在终点,会更明智。不过,matplotlib已经具有专用于水平线的功能。
BlivetWidget 2015年


31

如果要在轴上绘制一条水平线,也可以尝试ax.hlines()方法。您需要在数据坐标中指定y位置和xminxmax(即,您在x轴上的实际数据范围)。示例代码段为:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1, 21, 200)
y = np.exp(-x)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.hlines(y=0.2, xmin=4, xmax=20, linewidth=2, color='r')

plt.show()

上面的代码段将在处的轴上绘制一条水平线y=0.2。水平线的起点是x=4,终点为x=20。生成的图像是:

在此处输入图片说明


这比axhline需要特定的x范围的线条要方便得多。'axhline'和'hlines'有什么区别?
杰森目标

在中axhlinexminxmax是轴坐标系,因此它们在[0,1]范围内。您可以在此处看到不同坐标系之间的差异。
jdhao

谢谢你,如果这xminxmax差异之间唯一的区别axhlinehlines,是不是后者占据了前者?
詹森·目标

15

用途matplotlib.pyplot.hlines

  • y 可以作为单个位置传递: y=40
  • y 可以作为多个位置传递: y=[39, 40, 41]
  • 如果您在绘制的东西,如一个数字fig, ax = plt.subplots(),然后更换plt.hlinesplt.axhlineax.hlinesax.axhline分别。
  • matplotlib.pyplot.axhline只能绘制一个位置(例如y=40
import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(1, 21, 200)
plt.hlines(y=40, xmin=0, xmax=len(xs), colors='r', linestyles='--', lw=2)
plt.show()

在此处输入图片说明


12

除了最upvoted答案在这里,你也可以使用链axhline打完电话后plotpandasDataFrame

import pandas as pd

(pd.DataFrame([1, 2, 3])
   .plot(kind='bar', color='orange')
   .axhline(y=1.5));

在此处输入图片说明


2

对于那些总是忘记命令的人来说,一个不错的简便方法axhline

plt.plot(x, [y]*len(x))

你的情况xs = xy = 40。如果len(x)大,则效率低下,您应该真正使用axhline


2

您可以使用plt.grid绘制水平线。

import numpy as np
from matplotlib import pyplot as plt
from scipy.interpolate import UnivariateSpline
from matplotlib.ticker import LinearLocator

# your data here
annual = np.arange(1,21,1)
l = np.random.random(20)
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)

# plot your data
plt.plot(xs,spl(xs),'b')

# horizental line?
ax = plt.axes()
# three ticks:
ax.yaxis.set_major_locator(LinearLocator(3))
# plot grids only on y axis on major locations
plt.grid(True, which='major', axis='y')

# show
plt.show()

随机数据图示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.