更改Matplotlib投影轴的背景颜色

3
我将尝试使用Cartopy创建一个图形,其中需要绘制投影坐标轴在未投影坐标轴之上。
以下是尽可能简单的代码版本,用于在坐标轴上替换内容以获得背景颜色:
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

#Setup figure
fig = plt.figure()

#Unprojected axis
ax1 = fig.add_subplot(111, axisbg='b')

#Projected axis
ax2 = fig.add_subplot(111, axisbg='None', projection=ccrs.Mercator())

plt.show()

将蓝色轴线隐藏后,生成如下效果: enter image description here 从上述代码中删除 projection=ccrs.Mercator() 参数即可得到期望的结果: enter image description here

如何使投影轴线背景透明?

谢谢!

编辑: 我尝试了其他设置背景透明的方法,但都没有成功:

ax2 = fig.add_subplot(111, axisbg='None', alpha=0, projection=ccrs.Mercator())
ax2.patch.set_facecolor('none')
ax2.patch.set_alpha(0)

你尝试过在subplot参数中添加alpha=0.5吗?这应该定义了透明度水平。我似乎无法使用pip设置cartopy,但我认为这应该有效。 - Francisco Vargas
@FranciscoVargas 感谢您的建议,不幸的是,我已经尝试过其他透明度方法(请参见编辑),但没有成功。 - Siyh
2个回答

6

您可以使用imshow()方法将图像投影到地图的背景上。Cartopy使用stock_img()方法来实现这一目的。

您还可以通过使用NumPy创建一个2x2像素的图像,并将其投影到整个地图范围内,从而获得纯色背景:

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.feature import LAND
    
ax = plt.axes(projection=ccrs.PlateCarree())

# Set RGB value to ocean colour
ax.imshow(np.tile(np.array([[[200, 200, 255]]], 
          dtype=np.uint8), [2, 2, 1]),
      origin='upper',
      transform=ccrs.PlateCarree(),
      extent=[-180, 180, -90, 90])

ax.add_feature(LAND)
ax.coastlines()

plt.show()

enter image description here


1
extent=[-180, 180, -90, 90] - Snow bunting

4

Cartopy在某些方面仍不够完善,需要更深入地了解代码才能找到一些内容的控制方法。

我认为你需要的基本调整是这样的:

ax2.background_patch.set_fill(False)

我的示例已被黑客攻击:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

fig = plt.figure()
ax1 = fig.add_subplot(111, axisbg='b')
ax2 = fig.add_subplot(111, axisbg='None', projection=ccrs.Mercator())
ax2.background_patch.set_fill(False)
ax2.add_feature(cartopy.feature.LAND)
ax2.coastlines(color='red', linewidth=0.75)
plt.show()

图片: 在这里输入图片描述

编辑:已删除复制/粘贴错误

希望对你有所帮助
Patrick


我还发现需要保留axisbg='None'参数以保持轴内容的预期绘制顺序(不知何故,去掉它并没有阻止其透明...) - Siyh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接