Python Matplotlib添加颜色条

6

我使用MatlobLib和shapereader中的“自定义”形状遇到了问题。导入和查看插入的面是没有问题的,但是我无法在我的图形上放置一个颜色条。

我已经尝试了教程中的几种方法,但我相信这个问题有一个聪明的解决方案。

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

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,这似乎已经有点棘手了。如果你这样做,可能会有所帮助,可以相应地标记你的帖子。 - Rutger Kassies
感谢您的评论,我已经添加了导入(抱歉,它们有点混乱:()- 是的,这是Cartopy和Basemap,因为我根据这个“教程”完成了它:https://dev59.com/1mYr5IYBdhLWcg3wxNC8 ,是否有更简单的方法来做到这一点? - user3066027
1个回答

13

如评论中所述,我会认真考虑混合使用 BasemapCartopy,你有特定的原因这样做吗?两者基本上都是为了扩展Matplotlib的地理绘图功能而存在。它们都有效,都有其优缺点。

在你的示例中,你有一个 Basemap 轴 m,一个 Cartopy 轴 ax,并且你使用了 Pylab 接口通过使用 plt. 操作当前活动的轴。也许从理论上讲是可能的,但对我来说似乎容易出错。

我无法修改您的示例以使其正常工作,因为数据缺失,您的代码不是有效的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')

在这里输入图像描述


非常感谢。嗯,在复制和粘贴过程中,代码可能会混乱。感谢您的示例!对我来说,只要它能正常工作就可以了,我只是在寻找一种简单的方法,并发现了上述描述的方法。我今晚会尝试一下 :) - user3066027
你如何将色条移近绘图?我的离得太远了。 - FaCoffee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接