我在使用来自Shapereader的“自定义”形状的MatlobLib时遇到了问题。导入和查看插入的面孔效果很好,但是我无法在我的图上放置颜色条。

我已经从教程中尝试了几种方法,但是我很确定有一个针对此问题的明智解决方案。

也许有人可以帮助我,我的当前代码如下:

from formencode.national import pycountry
import itertools
from matplotlib import cm, pyplot
from matplotlib import
from mpl_toolkits.basemap import Basemap
from numpy.dual import norm
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
import matplotlib as mpl
import matplotlib.colors as colors
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import numpy as np

def draw_map_for_non_normalized_data_with_alpha2_counrty_description(data, title=None):

m = Basemap()
ax = plt.axes(projection=ccrs.PlateCarree())

list = []
sum = 0
for key in data:
    sum += data[key]

for key in data.keys():
    new_val = (data[key]+0.00)/sum
    list.append(new_val)
    data[key] = new_val

#===========================================================================
# print str(min(list))
# print str(max(list))
#===========================================================================

cmap = mpl.cm.cool
colors = matplotlib.colors.Normalize(min(list)+0.0, max(list)+0.0)

labels = []
features = []
for country in shpreader.Reader(shapename).records():
    a3_code = country.attributes["gu_a3"]
    try :
        a2_code =  pycountry.countries.get(alpha3=a3_code).alpha2
    except:
        a2_code = ""

    if a2_code in data:
        val = data[a2_code]

        color = cm.jet(norm(val))

        print str(val) + " value for color: " + str(color)

        labels.append(country.attributes['name_long'])
        feat = ax.add_geometries(country.geometry, ccrs.PlateCarree(), facecolor=color, label=country.attributes['name_long'])

        features.append(feat)
#ax.legend(features, labels, loc='upper right')
#===========================================================================
# fig = pyplot.figure(figsize=(8,3))
# ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15])
#===========================================================================

#cbar = m.colorbar(location='bottom')
cb1 = mpl.colorbar.ColorbarBase(ax, cmap=cmap,norm=colors,orientation='horizontal')
cb1.set_label('foo')

m.drawcoastlines()
m.drawcountries()
if title:
    plt.title(title)

plt.show()

正如您在代码内部看到的那样,我已经尝试了几种方法,但是没有一种对我有用。

也许有人对我有“暗示”的暗示。

感谢帮助,

亲切的问候

最佳答案

如上面的评论中所述,我会三思而后行地混合BasemapCartopy,是否有这样做的特定原因?两者基本上都在做相同的事情,通过地理绘图功能扩展了Matplotlib。两者都可以使用,它们都有各自的优点和缺点。

在您的示例中,您有一个 basemap 坐标轴m,一个Cartopy坐标轴ax,并且您通过使用Pylab来使用plt.接口(interface),该接口(interface)在当前 Activity 的坐标轴上运行。从理论上讲也许是可能的,但对我来说似乎容易出错。

我无法修改您的示例以使其工作,因为数据丢失并且您的代码不是有效的Python,例如,该函数的缩进不正确。但是,这是一个仅Cartopy的示例,显示了如何绘制Shapefile并使用相同的cmap/norm组合向轴添加颜色条的示例。

与您的代码的不同之处在于,您将包含映射的轴提供给ColorbarBase函数,这应该是专门用于颜色栏的单独的轴。

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib as mpl
import cartopy.io.shapereader as shpreader

fig, ax = plt.subplots(figsize=(12,6),
                       subplot_kw={'projection': ccrs.PlateCarree()})

norm = mpl.colors.Normalize(vmin=0, vmax=1000000)
cmap = plt.cm.RdYlBu_r

for n, country in enumerate(shpreader.Reader(r'D:\ne_50m_admin_0_countries_lakes.shp').records()):

    ax.add_geometries(country.geometry, ccrs.PlateCarree(),
                      facecolor=cmap(norm(country.attributes['gdp_md_est'])),
                      label=country.attributes['name'])

ax.set_title('gdp_md_est')

cax = fig.add_axes([0.95, 0.2, 0.02, 0.6])
cb = mpl.colorbar.ColorbarBase(cax, cmap=cmap, norm=norm, spacing='proportional')
cb.set_label('gdp_md_est')

10-06 00:01