首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >APLpy与matplotlib网格规范的不兼容

APLpy与matplotlib网格规范的不兼容
EN

Stack Overflow用户
提问于 2013-05-24 12:28:26
回答 1查看 700关注 0票数 0

我基本上只是想把gridspec和APLpy结合起来。

但不知怎么的,一排排子情节中的第一个情节总是表现出来,这意味着,它的大小不是它应该的大小。第一个图像显示了一个相当大的帧,而其他的则是很好的二次型。

基本上,我已经尝试了我所能想到的每一种方法来重新调整或调整第一个情节的大小:

  • 使用transformsBbox在填充APLpy之前和之后手动设置大小
  • 不是请求get_position().bounds,而是简单地在APLpy命令中使用get_position()
  • 在填充子图之前和之后使用set_aspect('equal')

毫无办法。它与图像也没有任何关系,绘制不同的图像或改变顺序都会导致同样的混乱。

我根本无法说服第一个子图改变它的大小。没有办法绕过gridspec,因为这一系列的子图是更大的绘图的一部分,使用gridspec以外的任何东西都会使其他事情变得非常复杂。

任何帮助都是非常感谢的,这让我有点疯狂。

代码语言:javascript
复制
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') 

有趣的是。使用for循环,就像nordev所建议的那样,将导致所有4个图都不是二次型的。

代码语言:javascript
复制
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') 
EN

回答 1

Stack Overflow用户

发布于 2014-07-11 20:16:57

代码的第一个问题是行

代码语言:javascript
复制
ax=plt.subplot(gs[0,i])

这个创建了一个新的对象,您将独立于FITSFigure对象所使用的轴来操作这个对象。如果要修改轴,可以使用无文档的fig._ax1对象而不是ax对象。YMMV,但是有些matplotlib的API被(或冻结)aplpy忽略了;随着向使用WCSAxes的转换,这种情况有望发生变化。

您创建的ax对象的唯一好使用是,它们为您提供传递给FITSFigure()的位置。或者,我提交了一个拉请求,允许GridSpec直接与subplot=参数一起使用。

我认为您的问题可能与子图不对称的默认位置有关-参见figure.subplot.leftfigure.subplot.right中的rcParams。尝试:

代码语言:javascript
复制
gs=gridspec.GridSpec(1, 4, left=0.1, right=0.9)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16734986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档