【问题标题】:How to make an inset plot with mollweide projection?如何使用 mollweide 投影制作插图?
【发布时间】:2022-11-17 05:31:41
【问题描述】:

我想使用 Mollweide 投影为一组主轴和一个插入轴制作天空图。这对于主轴很容易,但对于插图则不然。我尝试了一些不同的东西,但它不适用于插图。请帮忙!

Here可以找到经纬度数据,here可以找到天空位置概率密度数据。

首先,我制作主要情节:

xmin = min(l)
xmax = max(l)
ymin = min(b)
ymax = max(b)
X, Y = np.meshgrid(np.linspace(xmin, xmax, 100), np.linspace(ymin, ymax, 100))

mpl.rcParams["text.usetex"] = True
fig = plt.figure(1)
fig.set_figheight(8)
fig.set_figwidth(8)

ax = plt.axes(projection='mollweide')
ax.grid()
# skypost is the sky location probability-density data accessible above
plt.contour(X, Y, skypost, colors='blue', levels=[5, 50, 95])

效果很好。接下来,我定义了插入轴并绘制了等高线,但似乎没有办法完全适用于此。我想要的是让插图在轮廓上放大,同时保持摩尔维德投影。我试着按照 ligo.skymaps 上的例子去做,即

axesinset = plt.axes(
    [0.0, 0.2, 0.25, 0.25], 
    projection='astro degrees zoom', 
    center='110d +20d', 
    radius='10 deg' )
plt.sca(axesinset)
axesinset.contour(X, Y, skypost, colors='blue', levels=[5, 50, 95])
axesinset.grid()

但这不起作用,因为轮廓甚至没有出现!我不明白为什么他们不出现。我不明白为什么 inset 的 x 轴是向后的?

相反,我尝试在插图中绘制一个新的 mollweide 投影,并限制 xlim 和 ylim,但它说 mollweide 投影不支持这些选项。有没有办法限制轴的限制?

最后,我尝试在没有 mollweide 的情况下只做一个常规插图,这是有效的,但是轮廓的形状相对于与我的案例物理相关的主 mollweide 图上的轮廓扭曲了。所以这是非常次优的。

非常感谢任何建议和意见。

【问题讨论】:

    标签: python python-3.x matplotlib map-projections insets


    【解决方案1】:

    要以正确的方式使用轴,您可以使用 rotate 旋转子图。

    关于您的轮廓未显示的事实,可能是因为您必须添加 transform 关键字。如果不指定,则默认以像素坐标绘制(https://docs.astropy.org/en/stable/visualization/wcsaxes/overlays.html)。

    下面的示例显示所需的点(蓝色)是通过添加 ax.get_transform("world") 获得的。 由于rotate,蓝色和绿色点位于右下角。

    我想 contour 应该是一样的。

    ax = plt.subplot(111, projection='geo degrees zoom',
                  center="0d - 0d", radius='10 deg', rotate='180 deg')
    ax.grid()
    ax.set_xlabel(r"$phi , [deg]$")
    ax.set_ylabel(r"$	heta , [deg]$")
    
    ax.scatter(0,0, color = "blue")
    ax.scatter(100,0, color = "green")
    ax.scatter(0,0, color = "red", transform = ax.get_transform("world"))
    

    【讨论】:

    • 谢谢,但我看不出这如何回答我的问题。这应该如何与插入轴结合使用?
    • 此外,当我尝试使用 ax.get_transform("world") 时,它给出了错误“TypeError: get_transform() takes 1 positional argument but 2 were given”
    • 你好 !摩尔维德已经在“正确”的单位系统中。你只需要使用transform = axesinset.get_transform("world")
    【解决方案2】:

    我参加聚会有点晚了,但我认为值得一提的是我为 EOmaps 创建了一个不错的 inset-map functionality...

    它允许您在任意投影中创建插图,并且您可以添加任何您想要的功能!

    from eomaps import Maps
    
    m = Maps(Maps.CRS.Mollweide())
    m.add_feature.preset.coastline()
    
    # create a rectangular inset-map that shows a 5 degree rectangle
    # centered around a given point
    inset = m.new_inset_map(xy=(6, 43), xy_crs=4326,
                            radius=5, radius_crs=4326,
                            inset_crs=Maps.CRS.Mollweide(),
                            shape="rectangles")
    inset.add_feature.preset.coastline()
    inset.add_feature.preset.ocean()
    inset.add_feature.cultural_10m.urban_areas(fc="r", ec="none")
    
    m.apply_layout(
        {'0_map': [0.01, 0.17333, 0.98, 0.65333],
         '1_map': [0.05, 0.11667, 0.43341, 0.76667]})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多