解决方案
您可以通过将适当的坐标传递给Line2D来延伸网格线,使用ax1.grid(ydata=[-space_between_axes, 1], clip_on=False)
。
import matplotlib.pyplot as plt
d = [1,2,3,4,5,6,7,8,9]
f = [0,1,0,0,1,0,1,1,0]
fig = plt.figure()
fig.set_size_inches(30,10)
ax1 = fig.add_subplot(211)
line1 = ax1.plot(d,marker='.',color='b',label="1 row")
ax2 = fig.add_subplot(212)
line1 = ax2.plot(f,marker='.',color='b',label="1 row")
plt.setp(ax1.get_xticklabels(), backgroundcolor="white")
space_between_plots = plt.rcParams["figure.subplot.hspace"]
ax1.xaxis.grid(ydata=[-space_between_plots, 1], clip_on=False)
ax1.yaxis.grid()
ax2.grid()
plt.show()
![enter image description here](https://istack.dev59.com/yDSJO.webp)
这是如何工作的?
根据
matplotlib.axis.Axis.grid == ax1.xaxis.grid
方法的文档,关键字参数可以传递给
Line2D
。
Line2D
以x坐标和y坐标(
xdata
和
ydata
)作为参数。
但是使用的是哪个坐标系?您可以使用
ax1.get_xgridlines()[-1].get_xydata()
来检查。输出结果是
array([[9., 0.], [9., 1.]])
。显然,x值是数据坐标,y值是
轴坐标。
下一个问题:需要延伸多远?在这种特殊情况下,您可以直接取数字
-1
,因为与下面相同线条的重叠是看不见的。然而,正确的方法是获取实际距离,在这种情况下使用
space_between_plots = plt.rcParams["figure.subplot.hspace"]
。这是
0.2
,意味着一个图的高度的五分之一。
顶部保持不变,为
1
。
由于Matplotlib默认不在绘图区域外绘制任何内容,所以需要
clip_on=True
。
注意
看起来Matplotlib存在一个bug,在某些情况下使得这个解决方案无法工作。例如,如果我省略
plt.setp(...)
,Matplotlib会抱怨接收到多次
ydata
参数,并引发TypeError异常。