在子图上绘制网格Python matplotlib

06odsfpq  于 2023-06-06  发布在  Python
关注(0)|答案(4)|浏览(147)

我尝试了以下方法:

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")
ax1.grid()
ax2.grid()
plt.show()

我得到以下输出:

但我期待以下输出:

我怎样才能得到两个地块的网格?

siotufzp

siotufzp1#

没有用于创建子地块间网格的内置选项。在这种情况下,我会说一个简单的选择是在背景中创建第三个轴,在x方向上使用相同的网格,这样可以在两个子图之间看到网格线。

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, (ax1,ax2) = plt.subplots(nrows=2, sharex=True)
ax3 = fig.add_subplot(111, zorder=-1)
for _, spine in ax3.spines.items():
    spine.set_visible(False)
ax3.tick_params(labelleft=False, labelbottom=False, left=False, right=False )
ax3.get_shared_x_axes().join(ax3,ax1)
ax3.grid(axis="x")

line1 = ax1.plot(d, marker='.', color='b', label="1 row")
line1 = ax2.plot(f, marker='.', color='b', label="1 row")
ax1.grid()
ax2.grid()
plt.show()

vi4fp9gy

vi4fp9gy2#

以下是我的解决方案:

import matplotlib.pyplot as plt

x1 = [1,2,3,4,5,6,7,8,9]
x2= [0,1,0,0,1,0,1,1,0]
x3= range(-10,0)
# frameon=False removes frames
# fig, (ax1,ax2, ax3) = plt.subplots(nrows=3, sharex=True, subplot_kw=dict(frameon=False))
fig, (ax1,ax2, ax3) = plt.subplots(nrows=3, sharex=True)
# remove vertical gap between subplots
plt.subplots_adjust(hspace=.0)

ax1.grid()
ax2.grid()
ax3.grid()

ax1.plot(x1)
ax2.plot(x2)
ax3.plot(x3)

无帧subplot_kw=dict(frameon=False)

k3fezbri

k3fezbri3#

一个选项是创建单个图,然后仅偏移数据。所以一个比另一个更重要。

6yt4nkrj

6yt4nkrj4#

解决方案

通过使用ax1.grid(ydata=[-space_between_axes, 1], clip_on=False)将适当的坐标传递到Line2D,可以延伸轴网线。

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")  # Eliminate strike-through.
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()

如何操作?

  • 根据matplotlib.axis.Axis.grid == ax1.xaxis.grid方法的文档,关键字参数可以传递给Line2D
  • Line2D将x和y坐标(xdataydata)作为参数。
  • 使用什么样的坐标系?你可以用ax1.get_xgridlines()[-1].get_xydata()来检查。输出为array([[9., 0.], [9., 1.]])。显然,x值在Data坐标中,y值在Axes坐标中。
  • 下一个问题你需要向下伸展多远?在这个特殊的例子中,你可以只取-1,因为与相同的线的重叠是不可见的。然而,正确的方法是获得实际距离,在本例中为space_between_plots = plt.rcParams["figure.subplot.hspace"]。也就是0.2,这意味着一个图的高度的五分之一。
  • 顶部保持不变,为1
  • clip_on=True是必需的,因为Matplotlib在默认情况下不会在绘图区域之外绘制任何东西。

注意事项

看起来Matplotlib有一个bug,使得这个解决方案在某些情况下无法工作。例如,如果我遗漏了plt.setp(...),Maptlotlib会抱怨它多次收到ydata参数并引发TypeError。

相关问题