Руководство по OSMnx 8 (Boeing) — Центральность

#edges #osmnx

#ребра #osmnx

Вопрос:

У меня есть вопрос из двух частей, связанный с OSMnx Tutorial 8 от Boeing — Анализ центральности уличной сети. Во-первых, у меня есть вопрос о знании, касающийся центральности близости ребер, а затем вопрос на основе кода, касающийся центральности между ребрами. Моя цель — рассчитать близость границ и центральность между станциями в различных местоположениях.

1. Центральное значение близости ребер

Следующий код хорошо работает для меня:

 # edge closeness centrality: convert graph to a line graph so edges become nodes and vice versa
edge_centrality = nx.closeness_centrality(nx.line_graph(G))

# list of edge values for the original graph
ev = [edge_centrality[edge   (0,)] for edge in G.edges()]

# color scale converted to list of colors for graph edges
norm = colors.Normalize(vmin=min(ev)*0.8, vmax=max(ev))
cmap = cm.ScalarMappable(norm=norm, cmap=cm.inferno)
ec = [cmap.to_rgba(cl) for cl in ev]
  

Вопрос: Кто-нибудь может объяснить, почему в коде нормализации минимальное значение ребра умножается на 0,8, а максимальное значение устанавливается на максимальное значение ребра? Я не слишком знаком с литературой, поэтому буду признателен за любой совет.

2. Центральность между ребрами

Я пытаюсь вычислить центральность между ребрами аналогично приведенному выше коду для центральности близости ребер на том же графике в примере. Я попробовал это и получил следующее:

 # edge betweenness centrality
edge_bcentrality = nx.edge_betweenness_centrality(G)

# list of edge values for the orginal graph
ev1 = [edge_bcentrality[edge   (0,)] for edge in G.edges()]

# color scale converted to list of colors for graph edges
norm = colors.Normalize(vmin=min(ev1)*0.8, vmax=max(ev1))
cmap = cm.ScalarMappable(norm=norm, cmap=cm.inferno)
ec = [cmap.to_rgba(cl) for cl in ev1]

# color the edges in the original graph with betweeness centralities in the line graph
fig, ax = ox.plot_graph(G, bgcolor='k', axis_off=True, node_size=0, node_color='w', node_edgecolor='gray', node_zorder=2,
                        edge_color=ec, edge_linewidth=1.5, edge_alpha=1)

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-14-6ee1d322067c> in <module>()
      1 # list of edge values for the orginal graph
----> 2 ev1 = [edge_bcentrality[edge   (0,)] for edge in G.edges()]
      3 
      4 # color scale converted to list of colors for graph edges
      5 norm = colors.Normalize(vmin=min(ev)*0.8, vmax=max(ev))

KeyError: (53090322, 53082634, 0)
  

Если кто-нибудь посоветует наилучший способ вычисления центральности между ребрами, я был бы очень признателен, поскольку я все еще новичок. Кроме того, было бы признателен, если бы кто-нибудь мог поделиться наилучшим способом продолжения нормализации.

Спасибо, что уделили время,

BC

Ответ №1:

Я применил этот код, и у меня он работает. Надеюсь, это поможет.

 #calculate betweenness
betweenness = nx.edge_betweenness(G=G, normalized=False)

# iterate over edges
edges = []
for i in betweenness.items():
    i = i[0]   (0,)
    edges.append(i)
for i,j in zip(edges,betweenness.keys()): 
    betweenness[i] = betweenness[j]
    del betweenness[j]

# color scale converted to list of colors for graph edges
norm = colors.Normalize(vmin=min(betweenness.values())*0.8, vmax=max(betweenness.values()))
cmap = cm.ScalarMappable(norm=norm, cmap=cm.viridis)
ec = [cmap.to_rgba(cl) for cl in betweenness.values()]

# color the edges in the original graph with betweeness centralities in the line graph
fig, ax = ox.plot_graph(G, bgcolor='w', axis_off=True, node_size=0, node_color='w', node_edgecolor='gray', node_zorder=2,
                        edge_color=ec, edge_linewidth=1.5, edge_alpha=1)
fig.show()