0

私は基本的にgridspec、APLpy と組み合わせようとしています。

しかし、どういうわけか、サブプロットの行の最初のプロットは常に機能しています。つまり、そのサイズは本来あるべきサイズではありません。最初の画像はかなり大きなフレームを示していますが、他の画像はきれいに 2 次です。

私は基本的に、この最初のプロットを再スケーリングまたはサイズ変更するために考えられるすべてを試しました:

  • APLpyで埋める前と後にtransformsサイズを手動で設定するBbox
  • を要求するのget_position().boundsではなく、単にget_position()APLpy コマンドで
  • 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') 

興味深い...nordevが示唆したようにforループを使用すると、4つのプロットすべてが2次でなくなります。

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') 
4

1 に答える 1

0

コードの最初の問題は行です

ax=plt.subplot(gs[0,i])

これにより、FITSFigure オブジェクトで使用される軸とは独立して操作する新しい軸オブジェクトが作成されます。軸を変更する場合は、ax オブジェクトの代わりに、文書化されていない fig._ax1 オブジェクトを使用できます。YMMV ですが、matplotlib の API の一部は aplpy によって無視されます (またはフリーズします)。これは、 WCSAxesを使用するように変換することで変更されることを願っています。

作成した ax オブジェクトの唯一の有効な使い方は、 に渡す位置を与えることですFITSFigure()。または、subplot= パラメータで GridSpec を直接使用できるようにするためのプル リクエストを送信しました。

あなたの問題は、サブプロットのデフォルトの位置が対称的ではないことに関連している可能性があると思います-figure.subplot.leftfigure.subplot.rightrcParams を参照してください。試す:

gs=gridspec.GridSpec(1, 4, left=0.1, right=0.9)
于 2014-07-11T20:16:57.817 に答える