2016-03-01 46 views
1

運行以下代碼以生成兩張圖像,並給出具有不同寬高比的圖形,如何強制執行圖形的圖形縱橫比? (不是圖像)如何在向圖中添加更多對象時保持matplotlib圖的縱橫比?

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) 

第一節省生成圖像是這樣的: image with sqare aspect ratio

第二個生成此: image with rectangular aspect ratio

正如我們所看到的,每個「象素」的第二圖像稍微不平方(擠在他的兩側)。如何在添加新圖形信息的同時保持圖形縱橫比?

回答

1

您可以添加顏色條後添加一個調用set_aspect()

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

最小的修改腳本,你需要做的兩件事情。添加

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

創建圖形後。這將強制x軸和y軸具有相同的步長。僅此一項將導致mpl數字上下的大量空白。

after plt.axis('equal')

您還需要手動調整的數字(我懷疑有一種方法來自動執行此操作)。您可以通過plt.colorbar之前調用fig.set_size_inches(10,8)做到這一點:我通過試錯來的(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) 

注意。所得到的數字是這樣的:

enter image description here

請參閱源代碼和圖片此jupyter筆記本:https://gist.github.com/ericdill/62e555bd82d76fb93e30

你也應該考慮使用面向對象(OO)接口的對象,而不是使用功能僅在pyplot,主要是因爲大量使用pyplot可能會產生一些意想不到的後果,因爲它所依賴的全球狀態有時可能不可靠。您可以在上面鏈接到jupyter筆記本中看到使用OO界面所需的腳本更改。

+0

漂亮的筆記本。和OO有關的好的提示。 – Lin

相關問題