Matplotlib/basemap: 在绘图的中心绘制一个地球
Matplotlib/basemap: Plot a globe in the center of a plot
我正试图在 python 中弄清楚如何使用底图制作这样的图:
关注左上角的图,这是每个箱子中密度的二维直方图,中心覆盖了一个地球图形。
我遇到的一个大问题是底图似乎不能很好地作为叠加图发挥作用。我可以传入轴,但它似乎接管了这些轴并且表现不佳。如果能够使用底图 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')
如您所见,底图完全占据了坐标轴,首先绘制的图无处可见。
您可以尝试以下方法:
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
或切换到 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 中弄清楚如何使用底图制作这样的图:
关注左上角的图,这是每个箱子中密度的二维直方图,中心覆盖了一个地球图形。
我遇到的一个大问题是底图似乎不能很好地作为叠加图发挥作用。我可以传入轴,但它似乎接管了这些轴并且表现不佳。如果能够使用底图 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')
如您所见,底图完全占据了坐标轴,首先绘制的图无处可见。
您可以尝试以下方法:
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
或切换到 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()