我基本上只是想把gridspec
和APLpy结合起来。
但是不知怎的,一行子图中的第一个图总是表现出来,意思是,它的大小不是它应该的样子。第一张图像显示了一个相当大的帧,而其他图像则很好地呈二次方。
我基本上已经尝试了一切我能想到的重新缩放或调整第一个情节:
transforms
和Bbox
在使用APLpy填充之前和之后手动设置尺寸get_position().bounds
,而只是要求APLpy命令中的get_position()
set_aspect('equal')
没有任何作用。它与图像无关,绘制不同的图像或更改顺序导致同样的混乱。
我根本无法说服第一个子图改变它的大小。 gridspec
没有办法,因为这一系列子图是更大图的一部分,使用除gridspec
以外的任何东西都会使其他一切变得相当复杂。
任何帮助将不胜感激,这让我有点疯狂。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib import gridspec
import aplpy
f=plt.figure()
gs=gridspec.GridSpec(1,4)
ax0=plt.subplot(gs[0,0]);ax1=plt.subplot(gs[0,1]);ax2=plt.subplot(gs[0,2]);ax3=plt.subplot(gs[0,3])
ax0.set_aspect('equal'); ax1.set_aspect('equal'); ax2.set_aspect('equal'); ax3.set_aspect('equal');
ax0.axes.get_xaxis().set_ticks([]); ax1.axes.get_xaxis().set_ticks([]); ax2.axes.get_xaxis().set_ticks([]); ax3.axes.get_xaxis().set_ticks([])
ax0.axes.get_yaxis().set_ticks([]); ax1.axes.get_yaxis().set_ticks([]); ax2.axes.get_yaxis().set_ticks([]); ax3.axes.get_yaxis().set_ticks([])
fig0=aplpy.FITSFigure(img0, figure=f, subplot=ax0.get_position().bounds); fig0.show_grayscale(invert=True)
fig1=aplpy.FITSFigure(img1, figure=f, subplot=ax1.get_position().bounds); fig1.show_grayscale(invert=True)
fig2=aplpy.FITSFigure(img2, figure=f, subplot=ax2.get_position().bounds); fig2.show_grayscale(invert=True)
fig3=aplpy.FITSFigure(img3, figure=f, subplot=ax3.get_position().bounds); fig3.show_grayscale(invert=True)
fig0.axis_labels.hide_x(); fig0.axis_labels.hide_y(); fig0.tick_labels.hide_x(); fig0.tick_labels.hide_y()
fig1.axis_labels.hide_x(); fig1.axis_labels.hide_y(); fig1.tick_labels.hide_x(); fig1.tick_labels.hide_y()
fig2.axis_labels.hide_x(); fig2.axis_labels.hide_y(); fig2.tick_labels.hide_x(); fig2.tick_labels.hide_y()
fig3.axis_labels.hide_x(); fig3.axis_labels.hide_y(); fig3.tick_labels.hide_x(); fig3.tick_labels.hide_y()
f.savefig('test.png')
有趣...使用forde循环,如nordev建议,导致所有4个图不是二次的。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib import gridspec
import aplpy
f=plt.figure()
gs=gridspec.GridSpec(1,4)
#img0,... are strings representing the image path
img_list=[img0, img1, img2, img3]
for i in range(0,4):
ax=plt.subplot(gs[0,i])
ax.set_aspect('equal')
ax.axes.get_xaxis().set_ticks([]); ax.axes.get_yaxis().set_ticks([])
fig=aplpy.FITSFigure(img_list[i], figure=f, subplot=ax.get_position())
fig.show_grayscale(invert=True)
fig.axis_labels.hide_x(); fig.axis_labels.hide_y()
fig.tick_labels.hide_x(); fig.tick_labels.hide_y()
f.savefig('test.png')
答案 0 :(得分:0)
代码的第一个问题是
行ax=plt.subplot(gs[0,i])
这个创建一个新的轴对象,您可以独立于FITSFigure对象使用的轴进行操作。如果要修改轴,可以使用未记录的fig._ax1对象而不是ax对象。 YMMV,但matplotlib的一些API被aplpy忽略(或冻结);这有望随着转换为使用WCSAxes而改变。
您创建的ax对象的唯一好处是它们会为您提供传递给FITSFigure()
的位置。或者,我提交了pull request以允许GridSpec直接与subplot =参数一起使用。
我认为您的问题可能与子图的默认位置无关 - 请参阅rcParams中的figure.subplot.left
和figure.subplot.right
。尝试:
gs=gridspec.GridSpec(1, 4, left=0.1, right=0.9)