cartopy + networkx: zorder не работает

Мне нужно создать карту, используя cartopy, и нанести на нее некоторые данные (используя networkx). Я могу это сделать, но за картой находятся networkx объекта. Я пытаюсь установить порядок слоев с помощью zorder, но ... это не работает :(

Моя единственная идея - добавить прозрачности к cartopy геометриям, но это выглядит совсем не красиво ... (в этом примере это не так плохо, но со всеми моими данными это выглядит ужасно)

Есть идеи о том, как заставить заказ?

Вот мой код:

import cartopy.crs as ccrs
from cartopy.io import shapereader as shpreader
import matplotlib.pyplot as plt
import networkx as nx

paises = ['Portugal', 'France', 'Canada', 'Brazil', 'Kazakhstan']
cidades = ['Aveiro', 'Ust-Kamenogorsk', 'Manaus']
links = [('Aveiro', 'Ust-Kamenogorsk'), 
         ('Manaus', 'Ust-Kamenogorsk'),
         ('Aveiro', 'Manaus')]
position = {'Aveiro': (-8.65, 40.6),
            'Manaus': (-60.0, -3.1),
            'Ust-Kamenogorsk': (82.6, 49.97)}

# map using cartopy:
shapename = 'admin_0_countries'
countries_shp = shpreader.natural_earth(resolution='110m',
                                    category='cultural', name=shapename)

ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=0.0, globe=None))
ax.set_global()

for country in shpreader.Reader(countries_shp).records():    
    nome = country.attributes['name_long']
    if nome in paises:
        i = paises.index(nome)
        artist = ax.add_geometries(country.geometry, ccrs.PlateCarree(),
                           facecolor='yellow',
                           #alpha=0.5,
                           zorder=10)
    else:
        artist = ax.add_geometries(country.geometry, ccrs.PlateCarree(),
                           facecolor='0.9',
                           zorder=10)

# add some data over the cartopy map (using networkx):                              
G = nx.Graph()
G.add_nodes_from(cidades)
G.add_edges_from(links)

nx.draw_networkx_nodes(G, position, node_size=20, nodelist=cidades, zorder=20)
edges=nx.draw_networkx_edges(G, position, edgelist=links, zorder=20)

plt.show()

Я получаю вот такое изображение:  zorder не работает с networkx через cartopy


person carla    schedule 20.07.2017    source источник


Ответы (2)


Случилось так, что ваш zorder=20 ничего не делает; это было проигнорировано, как вы можете видеть в их исходном коде. Что networkx делают в их draw_networkx_edges коде является:

def draw_networkx_edges(G, pos,
    ...
    edge_collection.set_zorder(1)  # edges go behind nodes
    ...

в их draw_networkx_nodes код:

def draw_networkx_nodes(G, pos,
    ...
    node_collection.set_zorder(2)
    ...

Теперь решение простое:

  • Если вы установите zorder в add_geometries на 1, тогда узлы будут перед картой, потому что это zorder 2. Но края все еще позади карты, потому что это zorder 1.
  • Теперь действительно лучшее решение - сначала получить как node_collection, так и edge_collection:

    nodes = nx.draw_networkx_nodes(G, position, node_size=20, nodelist=cidades)
    edges = nx.draw_networkx_edges(G, position, edgelist=links)
    

    Затем set_zorder для узлов и ребер:

    nodes.set_zorder(20)
    edges.set_zorder(20)
    
person Y. Luo    schedule 20.07.2017
comment
идеально! спасибо ... в следующий раз поищу ответы в исходниках :) - person carla; 20.07.2017

Если вы установите zorder фигур, которые вы добавляете на карту, равным 0, все будет работать должным образом.

ax.add_geometries(..., zorder=0)

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

person ImportanceOfBeingErnest    schedule 20.07.2017