axis('square')和set xlim之间的python交互作用

2024-09-27 22:30:52 发布

您现在位置:Python中文网/ 问答频道 /正文

对于相关图,我希望有一个光学正方形的图(x和y的长度相同,以像素为单位),但在x和y上也有一定的轴限制。我可以分别得到这两个图中的每一个,但不能同时得到:

import matplotlib.pyplot as plt

f, (ax1, ax2) = plt.subplots(1, 2)
x = [1 , 4 , 6]
y1 = [4, 7, 9]
y2 = [20, 89, 99]

ax1.plot(x, y1, 'o')
ax2.plot(x, y2, 'o')

myXlim = [0, 8]
ax1.set_xlim(myXlim)
ax2.set_xlim(myXlim)

ax1.axis('square')
ax2.axis('square')
# limit is gone here

ax1.set_xlim(myXlim)
ax2.set_xlim(myXlim)
# square is gone here

plt.show()

如果我只使用ax1.set_xlim(myXlim)(而不是square),那么我可以手动调整窗口大小以获得我想要的结果,但是我如何才能自动完成呢?在


Tags: hereplotisplt光学setsquareaxis
2条回答

获取正方形子图的一个选项是设置子图参数,以便生成的子图自动调整为方形。这有点牵扯,因为所有的边距和间距都需要考虑在内。在

import matplotlib.pyplot as plt

f, (ax1, ax2) = plt.subplots(1, 2)
x = [1 , 4 , 6]
y1 = [4, 7, 9]
y2 = [20, 89, 99]

def square_subplots(fig):
    rows, cols = ax1.get_subplotspec().get_gridspec().get_geometry()
    l = fig.subplotpars.left
    r = fig.subplotpars.right
    t = fig.subplotpars.top
    b = fig.subplotpars.bottom
    wspace = fig.subplotpars.wspace
    hspace = fig.subplotpars.hspace
    figw,figh = fig.get_size_inches()

    axw = figw*(r-l)/(cols+(cols-1)*wspace)
    axh = figh*(t-b)/(rows+(rows-1)*hspace)
    axs = min(axw,axh)
    w = (1-axs/figw*(cols+(cols-1)*wspace))/2.
    h = (1-axs/figh*(rows+(rows-1)*hspace))/2.
    fig.subplots_adjust(bottom=h, top=1-h, left=w, right=1-w)

ax1.plot(x, y1, 'o')
ax2.plot(x, y2, 'o')

#f.tight_layout() # optionally call tight_layout first
square_subplots(f)

plt.show()

这里的好处是能够自由缩放和自动缩放。缺点是一旦图形大小改变,子图大小就不再是正方形了。为了克服这个缺点,还可以在图形的大小更改时注册回调。在

^{pr2}$

上面的解决方案通过限制子批次在其网格内的空间来工作。另一种相反的方法,即子块的大小以某种方式固定,将在Create equal aspect (square) plot with multiple axes when data limits are different?的答案中显示。在

没有像“square”这样的单字魔术,但是您可以在设置了限制之后使用set_aspect来玩玩(去掉影响轴值的方形线):

...
ax1.set_aspect(1.5)
ax2.set_aspect(0.095)
plt.show()

我只是想看看上面的值:

enter image description here

您可以通过将x范围除以y范围来计算这个值-ax1的估计值是8/5,ax2的估计值是8/85,但是您可以使用实际值来精确:

^{pr2}$

相关问题 更多 >

    热门问题