cartopy + networkx:zorder 不工作
cartopy + networkx: zorder is not working
我需要使用 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=20
什么也没做;正如您在他们的源代码中看到的那样,它被忽略了。 networkx
在 their draw_networkx_edges
code 中所做的是:
def draw_networkx_edges(G, pos,
...
edge_collection.set_zorder(1) # edges go behind nodes
...
在 their draw_networkx_nodes
code 中是:
def draw_networkx_nodes(G, pos,
...
node_collection.set_zorder(2)
...
现在,解决方案很简单:
- 如果你将
add_geometries
中的zorder
设置为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)
如果将添加到地图的形状的 zorder 设置为 0,一切都会按预期进行。
ax.add_geometries(..., zorder=0)
我需要使用 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=20
什么也没做;正如您在他们的源代码中看到的那样,它被忽略了。 networkx
在 their draw_networkx_edges
code 中所做的是:
def draw_networkx_edges(G, pos,
...
edge_collection.set_zorder(1) # edges go behind nodes
...
在 their draw_networkx_nodes
code 中是:
def draw_networkx_nodes(G, pos,
...
node_collection.set_zorder(2)
...
现在,解决方案很简单:
- 如果你将
add_geometries
中的zorder
设置为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)
如果将添加到地图的形状的 zorder 设置为 0,一切都会按预期进行。
ax.add_geometries(..., zorder=0)