6

我在使用来自 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() 

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

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

感谢帮助,

亲切的问候

4

1 回答 1

13

正如上面评论中提到的,我会三思而后BasemapCartopy,是否有特定的理由这样做?两者基本上都在做同样的事情,用地理绘图功能扩展 Matplotlib。两者都可以使用,它们都有自己的优点和缺点。

在您的示例中,您有一个 Basemap axes m,一个 Cartopy 轴ax,并且您正在使用该Pylab界面,使用该界面plt.对当前活动的轴进行操作。也许理论上是可能的,但对我来说似乎很容易出错。

我无法修改您的示例以使其正常工作,因为数据丢失并且您的代码不是有效的 Python,例如函数的缩进不正确。但这是一个仅限 Cartopy 的示例,展示了如何绘制 aShapefile并使用相同的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')

在此处输入图像描述

于 2014-08-26T14:04:38.710 回答