matplotlib 如何垂直对齐多个子图的xticks?

xriantvc  于 2023-01-05  发布在  其他
关注(0)|答案(3)|浏览(212)

当我试图从 Dataframe 的特定行绘制3个子图时,我得到一个奇怪的结果,即第三个子图的xticks间距不同,即使图的开始似乎是正确的。我推测这可能与数据有关,因为FE 57和FE 59都从接近0的索引开始,而FE 66的索引为3600。有没有一种方法可以从0开始用白色来绘制所有的xtick,这样所有的xtick就可以彼此垂直对齐了?

fig, axs = plt.subplots(3, 1)
ser = plotdf[(plotdf['CAN_address'] == 'FE 57') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated']
axs[0].plot(ser.index, ser.values)
axs[0].set_title('FE 57')

ser = plotdf[(plotdf['CAN_address'] == 'FE 59') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated']
axs[1].plot(ser.index, ser.values)
axs[1].set_title('FE 59')

ser = plotdf[(plotdf['CAN_address'] == 'FE 66') & (plotdf['CAN_cmd'] == 62)]['CAN_value_translated']
axs[2].plot(ser.index, ser.values)
axs[2].set_title('FE 66')

plt.show()

b09cbbtk

b09cbbtk1#

应使用关键字参数sharex=...示例化子图。
您可以将值指定为'all''row''col''none',如果您考虑子图的二维排列,这些值是有意义的。
我说“你应该”而不是“你必须”,因为共享 x 轴只会将x刻度标签放置在底部子图上,你可能不同意这一点。
上面的图像生成为

import matplotlib.pyplot as plt

fig, (ax0, ax1) = plt.subplots(nrows=2, sharex='col')

ax0.plot((0, 7),(1, 12))
ax1.plot((-7,0),(1, -2))
plt.show()

如果你不喜欢标签只在底部,你可以这样做(下图)

fig, (ax0, ax1, ax2) = plt.subplots(nrows=3)

ax0.plot((0, 7),(1, 12))
ax1.plot((-7,0),(1, -2))
ax2.plot((-3,5),(-5,10))

# collect the lower and upper bounds of the x-axes
xmins, xmaxs = zip(*(ax.get_xlim() for ax in (ax0, ax1, ax2)))

# .set_xlim accepts a tuple, that we compute here
xlim = (min(xmins), max(xmaxs))

# finally, we set the same xlim on all the x-axes
for ax in (ax0, ax1, ax2):
    ax.set_xlim(xlim)

plt.show()

PS如果图上的y数据是“相同的”,我建议你也使用sharey=...,这样不同示例之间的比较就可以立即进行(更好的是,在同一个子图中绘制y数据)。

2nc8po8w

2nc8po8w2#

可以使用set_xlim()设置轴的限制:

x_min = -1000
x_max = 51000

for ax in axs:
  ax.set_xlim((x_min, x_max))
1u4esq0p

1u4esq0p3#

要垂直对齐多个子区的x刻度,可以先将所有子区的xlim设置为相同的值,以便它们都显示相同的x值范围。然后,可以使用每个子区的set_xticks方法指定x刻度的位置。

# Set the x-limits of all subplots to be the same
max_x = 3600

for ax in axs:
    ax.set_xlim((0, max_x))

# Set the number of x-ticks
num_xticks = 10

# Calculate the interval between x-ticks
interval = max_x // num_xticks

# Generate an array of x-tick values
xticks = range(0, max_x+1, interval)

# Set the x-ticks of all subplots to be the same
for ax in axs:
    ax.set_xticks(xticks)

相关问题