Skip to main content
 首页 » 编程设计

python之Matplotlib/ basemap : Plot a globe in the center of a plot

2025年02月15日42落叶无声

我正试图在 python 中弄清楚如何使用 basemap 来制作这样的图:

关注左上角的图,这是每个 bin 中密度的二维直方图,图形地球覆盖在中心。

我遇到的一个大问题是, basemap 似乎不能很好地用作叠加图。我可以传入轴,但它似乎接管了这些轴并且表现不佳。如果能够使用 basemap bluemarble 界面获得一个非常酷的地球,具有正确的阴影,并且所有内容都适用于当前日期、时间和视点,我会非常棒。

在我的例子中,我正在极地绘制 2d 等高线图(或使用 bar 来获得看起来很棒的小弯曲框)并希望放置一个半径为 1 的地球。

这是一个更简单的例子,说明什么不起作用。

import matplotlib.pyplot as plt 
import basemap 
from mpl_toolkits.basemap import Basemap 
plt.plot(range(-10,10)) 
ax = plt.gca() 
map = Basemap(projection='ortho',lat_0=45,lon_0=-100,resolution='l', ax=ax) 
map.fillcontinents(color='coral',lake_color='aqua') 

如您所见, basemap 完全占据了坐标轴,并且先绘制的图无处可见。

请您参考如下方法:

您可以尝试以下方法:

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
 
fig=plt.figure() 
ax=fig.add_axes([.1,.1,.8,.8],polar=True) # This is the background axis 
 
# variables for the background plot. I use some random numbers just for 
# illustration purposes 
N = 150 
r = (1 - 0.8) * np.random.random_sample(N) +0.8 
theta = 2*np.pi*np.random.random(N) 
area = 200*r**2*np.random.random(N) 
 
ax.scatter(theta, r, c=theta, s=area, cmap='hsv') 

此图必须相应地格式化,在这种情况下,具有透明度且没有轴信息:

plt.setp(ax.get_xticklabels(),visible=False) 
plt.setp(ax.get_yticklabels(),visible=False) 
ax.patch.set_visible(False) 
ax.grid(False) 
ax.axis('off') 

最后,使用 basemap 的地球仪:

ax2=fig.add_axes([.3,.3,.4,.4]) 
m = Basemap(projection='ortho',lon_0=-105,lat_0=-25,resolution='l',ax=ax2) 
m.bluemarble(scale=.1) # scale=.1 for low resolution 

诀窍是使用 add_axes 方法将次轴 (ax2) 置于中心。 您可以使用轴限制来获得所需的数字。希望能帮助到你。 Example image of the code