如何在matplotlib中设置长宽比?

s4chpxco  于 2023-05-23  发布在  其他
关注(0)|答案(7)|浏览(249)

我试图做一个正方形图(使用imshow),即。长宽比是1:1但我做不到这些都不起作用:

import matplotlib.pyplot as plt

ax = fig.add_subplot(111,aspect='equal')
ax = fig.add_subplot(111,aspect=1.0)
ax.set_aspect('equal')
plt.axes().set_aspect('equal')

看起来这些调用只是被忽略了(这是我在使用matplotlib时经常遇到的问题)。

sirbozc5

sirbozc51#

一个简单的选项,使用plt.gca()获取当前轴并设置方位角

plt.gca().set_aspect('equal')

代替你的最后一句

icnyk63a

icnyk63a2#

第三次的魅力。我的猜测是这是一个bug,Zhenya的回答表明它在最新版本中得到了修复。我有www.example.com版本0.99.1.1,并创建了以下解决方案:

import matplotlib.pyplot as plt
import numpy as np

def forceAspect(ax,aspect=1):
    im = ax.get_images()
    extent =  im[0].get_extent()
    ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect)

data = np.random.rand(10,20)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_xlabel('xlabel')
ax.set_aspect(2)
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
forceAspect(ax,aspect=1)
fig.savefig('force.png')

这是'force.png':

下面是我的失败,但希望信息的尝试。

第二个答案:

我下面的“原始答案”是多余的,因为它做了类似于axes.set_aspect()的事情。我想你应该使用axes.set_aspect('auto')。我不明白为什么会这样,但它为我生成了一个正方形图像图,例如这个脚本:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.rand(10,20)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_aspect('equal')
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')

生成纵横比“相等”的图像打印:

和一个具有“自动”纵横比:

下面在“原始答案”中提供的代码为显式控制的长宽比提供了一个起点,但是一旦调用imshow,它似乎就被忽略了。

原始答案:

下面是一个例程的示例,该例程将调整子图参数,以便您获得所需的纵横比:

import matplotlib.pyplot as plt

def adjustFigAspect(fig,aspect=1):
    '''
    Adjust the subplot parameters so that the figure has the correct
    aspect ratio.
    '''
    xsize,ysize = fig.get_size_inches()
    minsize = min(xsize,ysize)
    xlim = .4*minsize/xsize
    ylim = .4*minsize/ysize
    if aspect < 1:
        xlim *= aspect
    else:
        ylim /= aspect
    fig.subplots_adjust(left=.5-xlim,
                        right=.5+xlim,
                        bottom=.5-ylim,
                        top=.5+ylim)

fig = plt.figure()
adjustFigAspect(fig,aspect=.5)
ax = fig.add_subplot(111)
ax.plot(range(10),range(10))

fig.savefig('axAspect.png')

这会产生如下图形:

我可以想象,如果你在图中有多个子图,你会希望包括y和x子图的数量作为关键字参数(默认为1)提供的例程。然后使用这些数字和hspacewspace关键字,您可以使所有子图具有正确的纵横比。

vhmi4jdf

vhmi4jdf3#

您正在运行的matplotlib版本是什么?我最近不得不升级到1.1.0,有了它,add_subplot(111,aspect='equal')对我来说很好用。

kg7wmglp

kg7wmglp4#

经过多年的成功与上述答案,我发现这不工作了-但我确实找到了一个工作的解决方案,为次要情节在
https://jdhao.github.io/2017/06/03/change-aspect-ratio-in-mpl
当然,完全归功于上面的作者(他可能更愿意在这里发布),相关的行是:

ratio = 1.0
xleft, xright = ax.get_xlim()
ybottom, ytop = ax.get_ylim()
ax.set_aspect(abs((xright-xleft)/(ybottom-ytop))*ratio)

该链接还清晰地解释了matplotlib使用的不同坐标系。
感谢所有收到的伟大的答案-特别是@Yann的,它将仍然是赢家。

ohfgkhjo

ohfgkhjo5#

在我的情况下,以下设置效果最好:

plt.figure(figsize=(16,9))

其中(16,9)是您的地块纵横比。

inn6fuwd

inn6fuwd6#

你应该试试figaspect。对我很有效。从文档:
创建具有指定纵横比的地物。如果 arg 是一个数字,则使用该纵横比。>如果 arg 是一个数组,figaspect将确定一个图形的宽度和高度,该图形将适合保留纵横比的数组。返回以英寸为单位的图形宽度和高度。一定要创建一个轴与等于和高度,如
示例用法:

# make a figure twice as tall as it is wide
  w, h = figaspect(2.)
  fig = Figure(figsize=(w,h))
  ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
  ax.imshow(A, **kwargs)

  # make a figure with the proper aspect for an array
  A = rand(5,3)
  w, h = figaspect(A)
  fig = Figure(figsize=(w,h))
  ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
  ax.imshow(A, **kwargs)

编辑:我不确定你在找什么。上面的代码更改了画布(绘图大小)。如果你想改变matplotlib窗口的大小,那么用途:

In [68]: f = figure(figsize=(5,1))

这确实产生了5 × 1(W × H)的窗口。

biswetbf

biswetbf7#

这个答案是基于Yann的答案。它将设置线性或双对数图的纵横比。我使用了https://stackoverflow.com/a/16290035/2966723中的附加信息来测试轴是否为对数刻度。

def forceAspect(ax,aspect=1):
    #aspect is width/height
    scale_str = ax.get_yaxis().get_scale()
    xmin,xmax = ax.get_xlim()
    ymin,ymax = ax.get_ylim()
    if scale_str=='linear':
        asp = abs((xmax-xmin)/(ymax-ymin))/aspect
    elif scale_str=='log':
        asp = abs((scipy.log(xmax)-scipy.log(xmin))/(scipy.log(ymax)-scipy.log(ymin)))/aspect
    ax.set_aspect(asp)

显然,你可以使用任何你想要的log版本,我用过scipy,但numpymath应该没问题。

相关问题