我在 Python 中使用 Pyplot 创建了一个具有多个子图的图。
我想画一条不在任何地块上的线。我知道如何画一条线,它是情节的一部分,但我不知道如何在情节之间的空白处画线。
谢谢你。
感谢您的链接,但我不希望地块之间有垂直线。实际上,它是其中一个图上方的一条水平线,表示某个范围。有没有办法在图形顶部画一条任意线?
我在 Python 中使用 Pyplot 创建了一个具有多个子图的图。
我想画一条不在任何地块上的线。我知道如何画一条线,它是情节的一部分,但我不知道如何在情节之间的空白处画线。
谢谢你。
感谢您的链接,但我不希望地块之间有垂直线。实际上,它是其中一个图上方的一条水平线,表示某个范围。有没有办法在图形顶部画一条任意线?
首先,一种快速的方法是使用axvspan
大于 1 的 y 坐标和clip_on=False
. 不过,它绘制的是一个矩形而不是一条线。
举个简单的例子:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(range(10))
ax.axvspan(2, 4, 1.05, 1.1, clip_on=False)
plt.show()
对于绘图线,您只需指定transform
要用作 kwarg 的plot
(实际上,这同样适用于大多数其他绘图命令)。
要绘制“轴”坐标(例如 0,0 是轴的左下角,1,1 是右上角),请使用transform=ax.transAxes
, 并绘制图形坐标(例如 0,0 是图形窗口的左下角) , 而 1,1 是右上角) 使用transform=fig.transFigure
.
正如@tcaswell 提到的,annotate
这使得放置文本更简单,并且对于注释、箭头、标签等非常有用。您可以使用注释来做到这一点(通过在点和空白字符串之间画一条线),但是如果你只是想画一条线,不画更简单。
但是,对于听起来你想做的事情,你可能想做一些不同的事情。
创建一个变换很容易,其中 x 坐标使用一种变换,y 坐标使用不同的变换。这就是幕后的工作axhspan
。axvspan
对于您想要的东西,它非常方便,其中 y 坐标固定在轴坐标中,x 坐标反映数据坐标中的特定位置。
以下示例说明了仅绘制坐标区坐标与使用“混合”变换之间的区别。尝试平移/缩放两个子图,并注意会发生什么。
import matplotlib.pyplot as plt
from matplotlib.transforms import blended_transform_factory
fig, (ax1, ax2) = plt.subplots(nrows=2)
# Plot a line starting at 30% of the width of the axes and ending at
# 70% of the width, placed 10% above the top of the axes.
ax1.plot([0.3, 0.7], [1.1, 1.1], transform=ax1.transAxes, clip_on=False)
# Now, we'll plot a line where the x-coordinates are in "data" coords and the
# y-coordinates are in "axes" coords.
# Try panning/zooming this plot and compare to what happens to the first plot.
trans = blended_transform_factory(ax2.transData, ax2.transAxes)
ax2.plot([0.3, 0.7], [1.1, 1.1], transform=trans, clip_on=False)
# Reset the limits of the second plot for easier comparison
ax2.axis([0, 1, 0, 1])
plt.show()
请注意,对于底部图(使用“混合”变换),该线位于数据坐标中并随着新的坐标区范围移动,而顶部线位于坐标区坐标中并保持固定。