首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Matplotlib添加Colorbar

Python Matplotlib添加Colorbar
EN

Stack Overflow用户
提问于 2014-08-26 20:19:11
回答 1查看 11.7K关注 0票数 6

我在使用来自shapereader的“自定义”形状的MatlobLib时遇到了问题。导入和查看插入的面可以很好地工作,但我不能在图形上放置颜色条。

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

也许有人可以帮助我,我目前的代码附在下面:

代码语言:javascript
复制
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() 

正如您在代码中看到的,我已经尝试了几种方法,但都不适合我。

也许有人给了我“这个”提示。

谢谢你的帮助

亲切的问候

EN

回答 1

Stack Overflow用户

发布于 2014-08-26 22:04:39

正如在上面的评论中提到的,我在混合BasemapCartopy时会三思而后行,这样做有什么特别的原因吗?两者基本上都在做同样的事情,扩展Matplotlib的地理绘图功能。这两个都是有效的使用,他们都有他们的优势和劣势。

在您的示例中,您有一个底图轴m,一个Cartopy轴ax,并且您通过使用在当前活动轴上操作的plt.来使用Pylab接口。也许这在理论上是可能的,但在我看来,它很容易出错。

我不能修改你的例子来使它工作,因为数据丢失,你的代码不是有效的Python,例如,函数的缩进是不正确的。但这里是一个仅限Cartopy的示例,展示了如何绘制Shapefile并使用相同的Cartopy组合向轴添加颜色条。

您的代码的一个不同之处在于,您提供了包含到ColorbarBase函数的映射的轴,这应该是专用于colorbar的单独的轴。

代码语言:javascript
复制
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')

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25505674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档