2017-06-20 101 views
6

我想绘制图像(使用matplotlib.imshow)和同一图内的散点图。尝试此操作时,图像看起来比散点图小。小例子代码如下所示:使用matplotlib imshow获取相同的副图大小和分散

import matplotlib.pyplot as plt 
import numpy as np 

image = np.random.randint(100,200,(200,200)) 
x = np.arange(0,10,0.1) 
y = np.sin(x) 

fig, (ax1, ax2) = plt.subplots(1,2) 
ax1.imshow(image) 
ax2.scatter(x,y) 

plt.show() 

其中给出如下图所示:

enter image description here

我怎样才能获得两个sublpots具有相同的高度? (和宽度我想)

使用gridspec如图this答案我曾尝试:

fig=plt.figure() 
gs=GridSpec(1,2) 

ax1=fig.add_subplot(gs[0,0]) 
ax2=fig.add_subplot(gs[0,1]) 
ax1.imshow(image) 
ax2.scatter(x,y) 

但这给出相同的结果。我也试图调整插曲手动尺寸使用:

fig = plt.figure() 
ax1 = plt.axes([0.05,0.05,0.45,0.9]) 
ax2 = plt.axes([0.55,0.19,0.45,0.62]) 

ax1.imshow(image) 
ax2.scatter(x,y) 

通过试验和错误,我可以得到两个次要情节,以正确的尺寸,虽然在整体数字大小的任何变化将意味着次要情节会不更长的是相同的大小。

有没有办法让imshowscatter图在图中显示为相同的尺寸,而无需手动更改轴尺寸?

我使用Python 2.7和matplotlib 2.0.0

回答

6

这并不完全清楚你想要的结果是什么。

  1. 您可以使用自动方式的图像

    ax.imshow(z, aspect="auto") 
    

    enter image description here

  2. 。或者您可以根据其轴线的限制,使得它得到了相同的尺寸设定线图方面作为图像(在图像具有相等的x和y尺寸的情况下)

    asp = np.diff(ax2.get_xlim())[0]/np.diff(ax2.get_ylim())[0] 
    ax2.set_aspect(asp) 
    

    enter image description here 完整代码:

    import numpy as np 
    import matplotlib.pyplot as plt 
    
    x = np.linspace(0,10,20) 
    y = np.sin(x) 
    z = np.random.rand(100,100) 
    
    fig, (ax, ax2) = plt.subplots(ncols=2) 
    
    ax.imshow(z) 
    ax2.plot(x,y, marker=".") 
    
    asp = np.diff(ax2.get_xlim())[0]/np.diff(ax2.get_ylim())[0] 
    ax2.set_aspect(asp) 
    
    plt.show() 
    

    如果图像不具有相等限制(不是正方形),人们仍然需要由图像的纵横划分:

    asp = np.diff(ax2.get_xlim())[0]/np.diff(ax2.get_ylim())[0] 
    asp /= np.abs(np.diff(ax1.get_xlim())[0]/np.diff(ax1.get_ylim())[0]) 
    ax2.set_aspect(asp) 
    
+0

理想的结果是,这两个小区的大小完全相同,并在调整大小时保持这种方式。无论如何,'aspect ='auto''做了诀窍,谢谢。 – DavidG

1

下面是一些代码我使用:

fig, axis_array = plt.subplots(1, 2, figsize=(chosen_value, 1.05 * chosen_value/2), 
           subplot_kw={'aspect': 1}) 

我明确地选择会有我的身影2个情节,那数字将被选择为高值,并且每个子图将大约是宽度的一半,并且子图将具有1的纵横比(即,它们都将是方形的)。数字大小是强制间隔的特定比例。

+1

你的故事情节则看起来就像这样:HTTPS://i.stack .imgur.com/fsGB2.png我不认为这是OP想要的。 – ImportanceOfBeingErnest

0

我有同样的问题,并在SO中提出了非常类似的问题。@ImportanceOfBeingErnest提出的解决方案对我来说就像是一种魅力,但为了完整起见,我想提一个非常简单的解决方法,我被建议申请(信贷给@Yilun Zhang),然后我的问题被标记为与此完全相同之一:

的问题是,该地块区高度过大,这是离开空位置的形象。

如果你改变你的代码:

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6)) 

那么你得到想要的结果:

Desired outcome