具有不同y轴的子图中的纵横比

use*_*647 8 python matplotlib

我希望以下代码生成4个相同大小的子图,其中我设置的x轴和y轴的大小之间有一个共同的纵横比.参考下面的例子,我希望所有的子图看起来都像第一个(左上角).现在的错误是y轴的大小与其最大值相关.这是我想避免的行为.

import matplotlib.pyplot as plt
import numpy as np

def main(): 

    fig = plt.figure(1, [5.5, 3])
    for i in range(1,5):
        fig.add_subplot(221+i-1, adjustable='box', aspect=1) 
        plt.plot(np.arange(0,(i)*4,i))

    plt.show()

if __name__ == "__main__": 
    main()
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,matplotlib默认生成正确的东西(如下图所示):

   import  matplotlib.pyplot as plt 
   import numpy as np 

   def main(): 
       fig = plt.figure(1, [5.5, 3]) 
       for i in range(1,5): 
           fig.add_subplot(221+i-1) 
            plt.plot(np.arange(0,(i)*4,i)) 
       plt.show() 
Run Code Online (Sandbox Code Playgroud)

我只想补充一下控制x和y轴长度之间纵横比的能力.

这是我正在寻找的:

Joe*_*ton 9

我无法从你的问题中说出你想要的东西.

您是否希望所有图表都具有相同的数据限制?

如果是这样,请使用共享轴(我在subplots这里使用,但如果你想坚持使用matlab风格的代码,你可以避免使用它):

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(nrows=2, ncols=2, sharey=True, sharex=True)
for i, ax in enumerate(axes.flat, start=1):
    ax.set(aspect=1)
    ax.plot(np.arange(0, i * 4, i))

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果您希望它们全部共享轴限制,但要具有adjustable='box'(即非方轴边界),请使用adjustable='box-forced':

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(nrows=2, ncols=2, sharey=True, sharex=True)
for i, ax in enumerate(axes.flat, start=1):
    ax.set(aspect=1, adjustable='box-forced', xticks=range(i))
    ax.plot(np.arange(0, i * 4, i))

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


编辑:对不起,我还是有点困惑.你想要这样的东西吗?

import matplotlib.pyplot as plt 
import numpy as np 

fig, axes = plt.subplots(nrows=2, ncols=2)
for i, ax in enumerate(axes.flat, start=1):
    ax.set(adjustable='datalim', aspect=1)
    ax.plot(np.arange(0, i * 4, i))

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


好的,我想我终于理解了你的问题.我们都用"纵横比"来表示完全不同的东西.

在matplotlib中,图的纵横比是指数据限制的相对比例.换句话说,如果绘图的纵横比为1,则斜率为1的直线将出现在45度.您假设纵横比应用于轴的轮廓而不是轴上绘制的数据.

你只是希望子图的轮廓是方形的.(在这种情况下,它们都有不同的宽高比,由matplotlib定义.)

在这种情况下,你需要一个方形图.(还有其他方法,但只是制作一个正方形图形要简单得多.Matplotlib轴填充一个与它们所在图形大小成比例的空间.)

import matplotlib.pyplot as plt 
import numpy as np 

# The key here is the figsize (it needs to be square). The position and size of
# axes in matplotlib are defined relative to the size of the figure.
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8,8))

for i, ax in enumerate(axes.flat, start=1):
    ax.plot(np.arange(0, i * 4, i))

# By default, subplots leave a bit of room for tick labels on the left.
# We'll remove it so that the axes are perfectly square.
fig.subplots_adjust(left=0.1)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述