我正在尝试在同一图中绘制图像(使用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()
其中给出了下图:
如何让两个子凹坑具有相同的高度? (和我想的宽度)
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)
通过反复试验,我可以将两个子图获得正确的大小,但是整体图形大小的任何变化都意味着子图将不再具有相同的大小。
有没有办法让imshow
和scatter
图在图中看起来大小相同,而无需手动更改轴尺寸?
我正在使用Python 2.7和matplotlib 2.0.0
答案 0 :(得分:17)
您不希望得到的结果是什么。
您可以在图像上使用自动方面
ax.imshow(z, aspect="auto")
或者您可以根据其轴限制设置线图的方面,使其与图像的大小相同(如果图像具有相等的x和y尺寸)
asp = np.diff(ax2.get_xlim())[0] / np.diff(ax2.get_ylim())[0]
ax2.set_aspect(asp)
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)
答案 1 :(得分:2)
对于那些在两个图中共享 y 轴的人,将 constrained_layout
设置为 True
可能会有所帮助。
答案 2 :(得分:1)
这是我使用的一些代码:
fig, axis_array = plt.subplots(1, 2, figsize=(chosen_value, 1.05 * chosen_value / 2),
subplot_kw={'aspect': 1})
我明确地选择在我的图中将有2个子图,并且该图将被选择为高值,并且每个子图的宽度大约是该图的一半,并且子图的宽高比将为1(即,它们都是正方形)。图形尺寸是强制间距的特定比率。
答案 3 :(得分:1)