Matplotlib / basemap:在地块的中心绘制地球

时间:2016-12-18 19:20:19

标签: python matplotlib matplotlib-basemap

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

enter image description here

聚焦于左上图,这是每个箱中密度的二维直方图,图形地球覆盖在中心。

我遇到的一个大问题是底图似乎不能很好地作为一个过度绘图。我可以传递轴,但它似乎接管这些轴并且表现不佳。能够使用底图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')

正如你所看到的那样,底图完全占据了轴线,首先制作的地图无处可见。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:

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

答案 1 :(得分:-1)

或切换到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()