在保持坐标轴大小的情况下,在imshow上绘制Matplotlib图形

5
每当我使用imshow()绘制图像时,在双底部x轴上绘制1D数据会改变用于imshow()创建的初始x轴的大小和纵横比。如何避免这种行为?以下是如何复现此问题的方法:
import numpy as np
import matplotlib
matplotlib.use('macosx')
import matplotlib.pyplot as plt

im = np.random.rand(2856, 4290)
light_curve = im[1000, :]

fig = plt.figure(1, figsize=(10,10))
ax1 = plt.subplot(2,1,1)
ax1.imshow(im, cmap='gray', origin='lower')
ax2 = plt.subplot(2,1,2)
ax2.imshow(im, cmap='gray', origin='lower')
# Setting aspect ratio to equal does not help
ax2.set_aspect('equal')

ax21 = ax2.twinx()
ax21.plot(light_curve, alpha=0.7)
# Setting axis limits does not help
ax1.axis([0, im.shape[1], 0, im.shape[0]])
ax21.set_xlim([0, im.shape[1]])

以下是我的图形后端显示(macosx, 如果相关的话)

顶部:使用imshow()的图像。底部:绘制重叠,更改图像轴方面和大小

使用上面提到的twinx()不就是为此而设计的吗?那么我如何保持初始imshow()的x轴固定,并且使1D图的轴适应,而不改变大小或者搞乱它的纵横比例,而不完全手动构建我的坐标轴呢?

1个回答

2

很遗憾,该方面并没有在双轴之间传播,以至于它没有相同的框围绕着它。

我认为克服这个问题的唯一方法是手动计算该方面,并将其设置为双轴的值。

import numpy as np
import matplotlib.pyplot as plt

im = np.random.rand(285, 429)
light_curve = im[100, :]

fig = plt.figure(1, figsize=(8,8))
ax1 = plt.subplot(2,1,1)
ax1.imshow(im, cmap='gray', origin='lower')
ax2 = plt.subplot(2,1,2)

ax2.imshow(im, cmap='gray', origin='lower')
ax2.set_aspect("equal", "box-forced")

ax21 = ax2.twinx()

ax21.plot(light_curve, alpha=0.7)
# Setting axis limits does not help
ax21.set_xlim(ax1.get_xlim())

a = np.diff(ax21.get_ylim())[0]/np.diff(ax1.get_xlim())*im.shape[1]/im.shape[0]
ax21.set_aspect(1./a, "box-forced")

plt.show()

enter image description here


1
谢谢,它运行得很好。我会再试一下,看看如果我调整任何一个轴,稳定性如何。 - Wall-E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接