matplotlib Cartopy正投影中的0 - 360经度标注

nfs0ujit  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(144)

我尝试使用Cartopy生成一个正交图。我基本上让整个东西完全按照我想要的方式工作.除了经度网格线上的标签。虽然经度的约定通常是使用0 - 180 E或0 - 180 W,但其他物体的约定有时可以是0 - 360度。我想坚持后一种约定,在我接下来的工作中与经度约定保持一致。
我的问题是,LongitudeFormatter似乎没有任何选项允许我简单地绘制具有0 - 360标签的经度网格线。文档确实给予了如何使用PlateCarree(此处)完成此操作的示例,但我使用的是正交投影,尝试应用给定示例只是告诉我“此格式化程序不能用于非矩形投影。”话虽如此,LongitudeFormatter在其他方面似乎完全可以与正交投影一起工作?
这里有一个简单的例子来证明我的问题。

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.mpl.ticker import (LongitudeFormatter, LatitudeFormatter,
                                LongitudeLocator,LatitudeLocator)

plotproj = ccrs.Orthographic(central_longitude=90, central_latitude=45)
mgeodetic = ccrs.Geodetic()

fig1,ax1 = plt.subplots(1,1,figsize=(10.0,10.0),constrained_layout=True,
                        subplot_kw={"projection":plotproj})
ax1.set_global()

#grid lines
longlocs = [0,30,60,90,120,150,180,210,240,270,300,330,360]
gl = ax1.gridlines(draw_labels=True,x_inline=True,
                    xpadding=0,ypadding=0,xlocs=longlocs)
gl.top_labels = False
gl.left_labels = False
gl.xlocator = LongitudeLocator(nbins=12)
gl.ylocator = LatitudeLocator(nbins=12)
gl.xformatter = LongitudeFormatter(auto_hide=False)
gl.yformatter = LatitudeFormatter(auto_hide=False)

ax1.invert_xaxis() #makes longitude run the opposite direction, necessary for my use case

此示例生成下图:

我已经尝试了LongitudeFormatter的可用选项。direction_label = False只是让经度从0到180和-180到0运行。dateline_direction_labelzero_direction_label只影响0和180子午线。cardinal_labels是为了替换现有的E和W标签,但不影响值。
我觉得我一定是忽略了一些明显的东西-我如何绘制0到360经度标签?

eanckbw9

eanckbw91#

Q: How do I plot 0 to 360 longitude labels?
A: You can replace the labels with new ones that meet your needs.

下面给出的代码应该可以做到这一点。
把它放在ax1.invert_xaxis()线之前。

fig1, ax1 = plt.subplots(1, 1, figsize=(10.0, 10.0), constrained_layout=True, subplot_kw={"projection": plotproj})
ax1.set_global()

#grid lines
gl = ax1.gridlines(draw_labels=True, x_inline=True, xpadding=0, ypadding=0)

gl.top_labels = False
gl.left_labels = False
gl.xlocator = LongitudeLocator(nbins=12)
gl.ylocator = LatitudeLocator(nbins=12)
gl.xformatter = LongitudeFormatter(auto_hide=False)
gl.yformatter = LatitudeFormatter(auto_hide=False)

# (Relevant code)
# Generate the plot to enable access to the labels' attributes
ax1.draw(fig1.canvas.get_renderer())

# The current labels and the new ones to use
# If you need degree symbol just add + "°"
rep_vals = {'150°W': str(360-150),
            '120°W': str(360-120),
            '90°W': str(360-90),
            '60°W': str(360-60),
            '30°W': str(360-30),
            '0°': "0",
            '30°E': "30",
            '60°E': "60",
            '90°E': "90",
            '120°E': "120",
            '150°E': "150"
    }

# Iterate through the x-labels
for ea in gl.xlabel_artists:
    #print(ea, ea.get_position()[0], ea.get_visible())
    if ea.get_visible():
        # If visible, replace it with new label
        ea.set_text(rep_vals[ea.get_text()])

ax1.invert_xaxis()

相关问题