使用颜色条在 jupyter 中的单独单元格中生成底图和绘图
Generating basemap & plotting in separate cells in jupyter with colorbar
我希望生成一个底图地图,然后在这个底图上(在 jupyter-lab 中)绘制一些散点图,而不必每次都加载一个新的底图。我按照 中的说明进行操作,但是当我添加颜色图时,此解决方案不再有效,每次绘制时都会添加一个新的颜色条。
可重现的例子:
单元格 1
import matplotlib.pyplot as plt
import pandas as pd
from mpl_toolkits.basemap import Basemap
单元格 2
# generate sample data
data = pd.DataFrame({'lat':[53.360967, 53.3290910], 'lon':[-6.2298519, -6.311015], 'values':[0.25, 0.8]})
单元格 3
# generate the basemap
%%capture
fig, ax = plt.subplots(figsize=(20,10))
bmap = Basemap(epsg=3857, llcrnrlon=data['lon'][0], llcrnrlat=data['lat'][0],
urcrnrlon=data['lon'][1], urcrnrlat=data['lat'][1], ax=ax)
bmap.arcgisimage(service='ESRI_StreetMap_World_2D', xpixels = 12000, verbose= True)
单元格 4
# overlay some data on the basemap
x, y = bmap(list(data['lon']), list(data['lat']))
plot = bmap.scatter(x, y, s=200, marker='o', c=data['values'], cmap='bwr')
cbar = fig.colorbar(plot)
cbar.set_label("Label", rotation=270, labelpad=-10, fontsize=20, weight='semibold')
fig
我第一次 运行 单元格 4 我按预期获得了情节:See here
但是每次我 运行 单元格都会添加一个新的颜色条 See here
是否有解决方案或更好的方法?
编辑: 理想情况下,我希望最终得到一个用于生成底图的函数和一个用于绘制到底图上的函数,我可以多次调用底图上的不同数据同一张地图。
最后设法解决了这个问题。解决方案是使用底图生成颜色条,并使用 matplotlib.cm.ScalarMappable
独立于散点图。
所以 单元格 3 应该如下所示:
%%capture
import matplotlib.cm as cm
fig, ax = plt.subplots(figsize=(20,10))
# generate the colorbar
norm= cm.colors.Normalize(vmin=data['values'].min(), vmax=data['values'].max(), clip=False)
SM = cm.ScalarMappable(norm=norm, cmap='bwr')
SM.set_array([])
# generate the basemap
bmap = Basemap(epsg=3857, llcrnrlon=data['lon'][0], llcrnrlat=data['lat'][0],
urcrnrlon=data['lon'][1], urcrnrlat=data['lat'][1], ax=ax)
bmap.arcgisimage(service='ESRI_StreetMap_World_2D', xpixels = 12000, verbose= True)
cbar = fig.colorbar(SM, ax=ax)
cbar.set_label("Label", rotation=270, labelpad=-10, fontsize=20, weight='semibold')
然后Cell 4现在可以运行多次如下
x, y = bmap(list(data['lon']), list(data['lat']))
plot = bmap.scatter(x, y, s=200, marker='o', c=data['values'], cmap='bwr')
fig
我希望生成一个底图地图,然后在这个底图上(在 jupyter-lab 中)绘制一些散点图,而不必每次都加载一个新的底图。我按照
可重现的例子:
单元格 1
import matplotlib.pyplot as plt
import pandas as pd
from mpl_toolkits.basemap import Basemap
单元格 2
# generate sample data
data = pd.DataFrame({'lat':[53.360967, 53.3290910], 'lon':[-6.2298519, -6.311015], 'values':[0.25, 0.8]})
单元格 3
# generate the basemap
%%capture
fig, ax = plt.subplots(figsize=(20,10))
bmap = Basemap(epsg=3857, llcrnrlon=data['lon'][0], llcrnrlat=data['lat'][0],
urcrnrlon=data['lon'][1], urcrnrlat=data['lat'][1], ax=ax)
bmap.arcgisimage(service='ESRI_StreetMap_World_2D', xpixels = 12000, verbose= True)
单元格 4
# overlay some data on the basemap
x, y = bmap(list(data['lon']), list(data['lat']))
plot = bmap.scatter(x, y, s=200, marker='o', c=data['values'], cmap='bwr')
cbar = fig.colorbar(plot)
cbar.set_label("Label", rotation=270, labelpad=-10, fontsize=20, weight='semibold')
fig
我第一次 运行 单元格 4 我按预期获得了情节:See here
但是每次我 运行 单元格都会添加一个新的颜色条 See here
是否有解决方案或更好的方法?
编辑: 理想情况下,我希望最终得到一个用于生成底图的函数和一个用于绘制到底图上的函数,我可以多次调用底图上的不同数据同一张地图。
最后设法解决了这个问题。解决方案是使用底图生成颜色条,并使用 matplotlib.cm.ScalarMappable
独立于散点图。
所以 单元格 3 应该如下所示:
%%capture
import matplotlib.cm as cm
fig, ax = plt.subplots(figsize=(20,10))
# generate the colorbar
norm= cm.colors.Normalize(vmin=data['values'].min(), vmax=data['values'].max(), clip=False)
SM = cm.ScalarMappable(norm=norm, cmap='bwr')
SM.set_array([])
# generate the basemap
bmap = Basemap(epsg=3857, llcrnrlon=data['lon'][0], llcrnrlat=data['lat'][0],
urcrnrlon=data['lon'][1], urcrnrlat=data['lat'][1], ax=ax)
bmap.arcgisimage(service='ESRI_StreetMap_World_2D', xpixels = 12000, verbose= True)
cbar = fig.colorbar(SM, ax=ax)
cbar.set_label("Label", rotation=270, labelpad=-10, fontsize=20, weight='semibold')
然后Cell 4现在可以运行多次如下
x, y = bmap(list(data['lon']), list(data['lat']))
plot = bmap.scatter(x, y, s=200, marker='o', c=data['values'], cmap='bwr')
fig