matplotlib 同一子图的多个偏移y轴和多个偏移x轴(各至少3个)

f0brbegy  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(274)

我想在同一个轴对象上绘制不同尺度的数据。这意味着在同一个“轴”对象上有多个x轴和y轴(我知道有其他方法可以可视化多尺度数据,但我不想太详细地说明为什么我需要这样做!)。
我知道如何使用twinx在同一个图上使用“Multiple Yaxis With Spines" matplotlib demo”获得多个y轴。然而,在这个例子中,所有数据共享同一个x轴。我想同时有多个y轴和多个x轴。每个有2个是微不足道的:我可以简单地使用twin_ax = ax.twinx().twiny()。但是,如果我想要两个以上的x轴和y轴,我需要一种方法来偏移x轴和y轴的脊椎。问题是,如果我使用ax.twinx().twiny(),我只能偏移顶部的脊椎,而不是正确的脊椎。如果我使用ax.twiny().twinx(),那么它是反过来的。
下面是我的代码:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(constrained_layout=True)

twin1 = ax.twinx().twiny()
twin2 = ax.twinx().twiny()

twin2.spines.right.set_position(("axes", 1.2))
twin2.spines.top.set_position(("axes", 1.2))

plt.show()

似乎只有顶部的脊柱得到偏移,而不是正确的脊柱。如果我将顺序交换为twin2 = ax.twiny().twinx(),那么只有正确的脊柱得到偏移,而不是正确的!如何解决这个问题?

envsm3lx

envsm3lx1#

ax.twinx()从头开始创建一个新的轴ax2 *,叠加在ax上。参见此处。
在该方法的其余部分,您将看到ax2 Y刻度被修改,因此它们显示在右侧。
在这个ax.twinx()(即ax2)的顶部,通过调用.twiny()方法创建twin2,该方法还创建了一个新的轴 * 从头开始 *,与其他轴叠加。
这个新的twin2轴在右侧没有Y刻度(ax2有),因此当您设置脊柱的位置时,它可以工作,但不显示刻度和标签。
您可以在twins轴上使用以下函数来获得所需的结果

def prepare_twin(ax, offset=0):
    ax.yaxis.set_visible(True)
    
    ax.yaxis.tick_right()
    ax.yaxis.set_label_position('right')
    ax.yaxis.set_offset_position('right')

    ax.spines.right.set_position(("axes", offset))
    ax.spines.top.set_position(("axes", offset))

在您的代码中:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(constrained_layout=True)

twin1 = ax.twinx().twiny()
twin2 = ax.twinx().twiny()

prepare_twin(twin1, offset=1.2)
prepare_twin(twin2, offset=1.4)

备注:

  • 如果使用ax.twiny().twinx()(交换机顺序)创建twin1twin2,则此函数不再起作用。
  • 在此过程中,创建了5个重叠轴,而不是3个。

相关问题