Python Matplotlib добавляет цветовую панель

У меня проблема с использованием 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() 

как вы можете видеть внутри кода, я уже пробовал несколько способов, но ни один из них не работал у меня.

может быть у кого-то есть "подсказка" для меня.

Спасибо за помощь,

с уважением


person user3066027    schedule 26.08.2014    source источник
comment
Ваш код мне очень непонятен, это не полный пример. Какие модули вы используете? Похоже, вы смешиваете Basemap и Cartopy вместе, что уже кажется немного сложным для начала. Если вы это сделаете, это может помочь пометить ваш пост соответствующим образом.   -  person Rutger Kassies    schedule 26.08.2014
comment
спасибо за ваш комментарий, я добавил импорт (извините, они немного перепутались :( ) - да, это Cartopy и Basemap, потому что я сделал это в соответствии с этим руководством: stackoverflow.com/questions/13397022/ , есть ли другой способ сделать это проще?   -  person user3066027    schedule 26.08.2014


Ответы (1)


Как упоминалось в комментариях выше, я бы дважды подумал о смешивании Basemap и Cartopy, есть ли для этого конкретная причина? Оба в основном делают одно и то же, расширяя Matplotlib возможностями географического построения графиков. Оба подходят для использования, у них обоих есть свои плюсы и минусы.

В вашем примере у вас есть оси базовой карты 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')

введите здесь описание изображения

person Rutger Kassies    schedule 26.08.2014
comment
большое спасибо .. хм, код может быть перепутан во время копирования и вставки. спасибо за ваш пример! так как это работает, меня это устраивает, я просто ищу простой способ сделать это и нашел только способ, описанный выше. вечером попробую :) - person user3066027; 26.08.2014
comment
Как переместить цветовую полосу ближе к графику? Мой слишком далеко. - person FaCoffee; 16.05.2017