【问题标题】:How to keep aspect ratio on matplotlib graphs while adding more objects to the figure?如何在向图形添加更多对象的同时保持 matplotlib 图形的纵横比?
【发布时间】:2016-03-02 08:30:36
【问题描述】:

运行以下代码生成两个图像,给我不同纵横比的图形,如何强制图形的图形纵横比? (不是图片)

import pandas as pd 
import numpy as np 
import numpy.ma as ma 
import matplotlib.pyplot as plt

msize=25
rrange=int(msize**0.5)
jump=3
start=int(jump/2)

X,Y=np.meshgrid(range(0,msize),range(0,msize))
dat=np.random.rand(msize,msize)*rrange

msk=np.zeros_like(dat)
msk[start::jump,start::jump].fill(1)
mdat=msk*dat
mdat[mdat==0]=np.nan
mmdat = ma.masked_where(np.isnan(mdat),mdat)

fargs={ 'edgecolor': 'w',
        'facecolor': 'w',
        'frameon': True,
        }

fig = plt.figure(figsize=(10,10),**fargs)


cmap = plt.get_cmap('RdYlBu')
cmap.set_bad(color='#cccccc', alpha=1.)

plot = plt.pcolormesh(X,Y,mmdat,cmap=cmap)

plot.axes.set_ylim(0,msize-1)                                                                                                               
plot.axes.set_xlim(0,msize-1)

fargs['bbox_inches']='tight'

fig.savefig("masked100.png",dpi=100,**fargs)

plt.colorbar()
fig.savefig("masked101.png",dpi=100,**fargs)

第一次保存会生成这样的图像:

第二个生成这个:

如我们所见,第二张图片中的每个“像素”都略微不成正方形(在他的两侧被挤压)。如何在添加新图形信息的同时保留图形纵横比?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    添加彩条后可以添加对set_aspect()的调用:

    # ...
    plot.axes.set_ylim(0,msize-1)                                                                                                               
    plot.axes.set_xlim(0,msize-1)
    # 
    plot.axes.set_aspect('equal')
    # ...
    

    【讨论】:

      【解决方案2】:

      您需要对脚本进行的最小修改是两件事。添加

      fig = plt.figure(figsize=(10,10),**fargs)
      plt.axis('equal')
      

      创建图之后。这将强制 x 轴和 y 轴具有相同的步长。仅此一项就会导致生成的 mpl 图形上方和下方出现大量空白。

      您还需要手动调整图形大小(我怀疑是否有办法自动执行此操作)。您可以通过在 plt.colorbar 之前调用 fig.set_size_inches(10,8) 来做到这一点:

      fig.savefig("masked100.png",dpi=100, bbox_inches='tight', **fargs)
      fig.set_size_inches(10,8)
      plt.colorbar()
      fig.savefig("masked101.png",dpi=100, bbox_inches='tight', **fargs)
      

      请注意,我通过反复试验得出了 (10,8) 的图形大小。结果图如下所示:

      有关源代码和图像,请参阅此 jupyter notebook:https://gist.github.com/ericdill/62e555bd82d76fb93e30

      您还应该考虑使用面向对象 (OO) 接口而不是专门使用 pyplot 中的函数,主要是因为大量使用 pyplot 可能会产生一些意想不到的后果,因为它所依赖的全局状态可以有时会摇摆不定。您可以在上面指向 jupyter notebook 的链接中看到使用 OO 接口所需的脚本更改。

      【讨论】:

        猜你喜欢
        • 2015-07-09
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        • 2019-09-03
        • 2015-07-19
        • 2019-10-21
        • 2021-05-25
        • 1970-01-01
        相关资源
        最近更新 更多