【问题标题】:Matplotlib/basemap: Plot a globe in the center of a plotMatplotlib/basemap:在绘图中心绘制一个地球仪
【发布时间】:2016-12-18 19:20:19
【问题描述】:

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

专注于左上图,这是每个 bin 中密度的 2d 直方图,中心覆盖有图形地球。

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

在我的例子中,我正在制作极坐标的 2d 等高线图(或使用条形图获得看起来很棒的小曲线框),并且想要放置一个跨越半径 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')

如您所见,底图完全占据了坐标轴,而首先绘制的图则无处可寻。

【问题讨论】:

  • 你能包含一些示例代码吗?
  • 包含一个非常简单的例子

标签: python matplotlib matplotlib-basemap


【解决方案1】:

您可以尝试以下方法:

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')

最后,使用底图的地球仪:

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

【讨论】:

    【解决方案2】:

    或者切换到 Carto

    %matplotlib inline
    
    import cartopy.crs as ccrs
    import matplotlib.pyplot as plt
    
    ax = plt.axes(projection=ccrs.PlateCarree())
    ax.stock_img()
    
    ny_lon, ny_lat = -75, 43
    delhi_lon, delhi_lat = 77.23, 28.61
    
    
    plt.text(ny_lon - 3, ny_lat - 12, 'New York',
             horizontalalignment='right',
             transform=ccrs.Geodetic())
    
    plt.text(delhi_lon + 3, delhi_lat - 12, 'Delhi',
             horizontalalignment='left',
             transform=ccrs.Geodetic())
    
    plt.show()
    

    【讨论】:

    • 这绘制了一个正方形图......根本不是问题。
    • 我试图建议有一个更好的映射机制,使用 Python。而不是解决您的问题 - 因为我永远无法在 Python3.7 上安装 Basemap。
    猜你喜欢
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多