【问题标题】:aplpy show_polygons() with colorised faces带有彩色面的 aplpy show_polygons()
【发布时间】:2017-01-24 16:39:00
【问题描述】:

我想用 APLpy 在赤经/赤纬空间中绘制一些多边形,这些多边形由另一个一维列表着色,但我无法让 show_polygons() 工作。

我试图调整来自 APLpy show markers normalized by a colormap 的答案,但是当我运行它时,show_polygons() 不理解 kwargs cmapnormc 就像 show_markers() 一样。

我改编的独立脚本:

import aplpy, numpy
from numpy import array
import matplotlib.pyplot as plt
from matplotlib import cm, colors

polygons = [array([[ 46.33681474,  34.75536787],
   [ 45.04752709,  35.37650737],
   [ 44.63035494,  34.73768723],
   [ 46.33681474,  34.75536787]]), array([[ 46.45913142,  34.69050337],
   [ 45.04717721,  35.37189917],
   [ 44.6205633 ,  34.72362768],
   [ 46.45913142,  34.69050337]]), array([[ 46.52741447,  34.64997822],
   [ 45.04457814,  35.36619781],
   [ 44.60486296,  34.70107236],
   [ 46.52741447,  34.64997822]])]
zvalues = [  1.02018589e-10,   9.38471764e-12,   2.15806865e-11]

cmap1 = cm.YlOrBr
norm1 = colors.Normalize( numpy.min(zvalues), numpy.max(zvalues) )
fig   = aplpy.FITSFigure( numpy.zeros( (10,10) ) )
fig.show_polygons( polygons, cmap=cmap1, norm=norm1, c=zvalues, facecolor='none' )
plt.save( fname='plot.png' )

运行它会导致show_polygons() 引发不同的 AttributeErrors:

AttributeError: Unknown property cmap
AttributeError: Unknown property norm
AttributeError: Unknown property c

我对事物的看法:

$ python --version
Python 3.5.1 :: Continuum Analytics, Inc.
$ python
>>> import matplotlib
>>> print(matplotlib.__version__)
1.5.1
>>> import aplpy
>>> print(aplpy.__version__)
1.1.1

我怎样才能让show_polygons() 工作?

【问题讨论】:

    标签: python matplotlib aplpy


    【解决方案1】:

    首先,您要绘制的多边形坐标与您要绘制的像素数组不匹配 - 尽管我认为这对于您要绘制的真实拟合图形来说不是问题。所以你应该把你的代码改成这样:

    # fixed so that the polygons fall inside the image
    fig = aplpy.FITSFigure(numpy.zeros((50,50)))
    # zoom in on the coord values of the polygons
    fig.recenter(45.5, 35, 1.5)
    

    现在,实际回答这个问题:aplpy.FITSFigure 的不同方法将关键字参数传递给不同的 matplotib 例程 - 所以你不应该期望 show_polygonsshow_markers 以相同的方式运行。事实上,他们的文档字符串表明show_poligons 将其kwargs 传递给PatchCollection 类,而show_markers 会将它们发送给plt.scatter。这就是属性错误不断发生的原因。

    那么,如何通过一维颜色列表为补丁着色呢?据我所知,没有单一的解决方案,但您可以遍历多边形并单独着色:

    for p, c in zip(polygons, zvalues):
            fig.show_polygons([p], facecolor=cmap1(norm1(c)),
                              edgecolor='none', alpha=0.3)
    plt.show()
    

    这为我生成了下图:

    【讨论】:

    • 感谢您的回复,这似乎部分工作。看起来所有坐标都在像素的笛卡尔坐标系中(由于 numpy.zeros())?我需要它的多边形角坐标是球面 (RA,Dec) 坐标,而不是笛卡尔 (x,y)。
    • 您需要将有效的 HDU 或 fit 文件的路径传递给 aplpy.FITSFigure,以便它在天空坐标中绘图。这不是您的原始帖子显示的内容,因为您只给它一个像素数组。
    • 我使用zeros() 是因为我发现了另一个例子,但不知道它的所有后果。我没有适合的文件开始。我认为FITSFigure 可以接受astropy.wcs.WCS() 对象而不是zeros(),但我不知道如何为J2000 RA/Dec 设置一个设置。也许这是一个新的 stackoverflow 问题的主题。
    • @nk 制作一个最小的标头并从中生成带有astropy 的 wcs 对象应该相对简单。但是,是的,这似乎超出了您最初的问题。
    猜你喜欢
    • 2012-02-28
    • 2017-10-31
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多