gpt4 book ai didi

python - 共享不同大小的子图轴的缩放比例(不共享轴)

转载 作者:行者123 更新时间:2023-12-01 08:28:46 25 4
gpt4 key购买 nike

使用 matplotlib,我想绘制具有相同 x 轴刻度的两个图形,但我想显示不同大小的部分。我怎样才能做到这一点?

到目前为止,我可以使用 GridSpec 绘制不同大小的子图,或者共享 x 轴的相同大小的子图。当我同时尝试两者时,较小的子图具有相同的轴但缩放较小,而我想要相同的缩放和不同的轴,因此共享轴可能是一个错误的想法。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

x=np.linspace(0,10,100)
y=np.sin(x)

x2=np.linspace(0,5,60)
y2=np.cos(x2)

fig=plt.figure()

gs=GridSpec(2,3)

ax1 = fig.add_subplot(gs[0, :])
ax1.plot(x,y)

ax2 = fig.add_subplot(gs[1,:-1])
#using sharex=ax1 here decreases the scaling of ax2 too much
ax2.plot(x2,y2)

plt.show()

我希望 x.axes 具有相同的缩放比例,即相同的 x 值始终恰好位于彼此之上,this应该给你一个想法。较小的情节的框架可以扩展或适合情节,这并不重要。 As it is now ,比例不匹配。

提前致谢。

最佳答案

这还是有点粗糙。我确信有一种稍微更优雅的方法可以做到这一点,但您可以在 ax2 的轴坐标和数据之间创建自定义转换(请参阅 Transformations Tutorial ) ax1 的坐标。换句话说,你计算ax2左右边缘对应的位置的数据值(根据ax1)是多少,然后调整相应地,ax2 的 >xlim

这里的演示表明,即使第二个子图与第一个子图没有以任何特定方式对齐,它也能工作。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

x=np.linspace(0,25,100)
y=np.sin(x)

x2=np.linspace(10,30,60)
y2=np.cos(x2)

fig=plt.figure()

gs=GridSpec(2,6)

ax1 = fig.add_subplot(gs[0, :])
ax1.plot(x,y)

ax2 = fig.add_subplot(gs[1,3:-1])
ax2.plot(x2,y2)

# here is where the magic happens
trans = ax2.transAxes + ax1.transData.inverted()
((xmin,_),(xmax,_)) = trans.transform([[0,1],[1,1]])
ax2.set_xlim(xmin,xmax)

# for demonstration, show that the vertical lines end up aligned
for ax in [ax1,ax2]:
for pos in [15,20]:
ax.axvline(pos)

plt.show()

enter image description here

编辑:一种可能的改进是在 the xlim_changed event callback 中进行转换。这样,即使在第一个轴中缩放/平移,轴也能保持同步。

正如您所指出的,tight_layout() 也存在一个小问题,但通过直接调用回调函数可以轻松解决这个问题。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec


def on_xlim_changed(event):
# here is where the magic happens
trans = ax2.transAxes + ax1.transData.inverted()
((xmin, _), (xmax, _)) = trans.transform([[0, 1], [1, 1]])
ax2.set_xlim(xmin, xmax)


x = np.linspace(0, 25, 100)
y = np.sin(x)

x2 = np.linspace(10, 30, 60)
y2 = np.cos(x2)

fig = plt.figure()


gs = GridSpec(2, 6)

ax1 = fig.add_subplot(gs[0, :])
ax1.plot(x, y)

ax2 = fig.add_subplot(gs[1, 3:-1])
ax2.plot(x2, y2)

# for demonstration, show that the vertical lines end up aligned
for ax in [ax1, ax2]:
for pos in [15, 20]:
ax.axvline(pos)

# tight_layout() messes up the axes xlim
# but can be fixed by calling on_xlim_changed()
fig.tight_layout()
on_xlim_changed(None)

ax1.callbacks.connect('xlim_changed', on_xlim_changed)


plt.show()

关于python - 共享不同大小的子图轴的缩放比例(不共享轴),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54040731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com