pandas networkx绘制多向图
自定义点坐标
import ast
position= { }
point_from= list ( data[ 'Orig' ] . str . cat( data[ 'point_from' ] , sep= ':' ) )
point_to= list ( data[ 'Dest' ] . str . cat( data[ 'point_to' ] , sep= ':' ) )
pos_list= list ( set ( point_from+ point_to) )
for i in pos_list:
key, value= i. split( ':' )
lat, lon= ast. literal_eval( value)
position[ key. replace( "'" , "" ) ] = [ lon, lat]
创建对象
G= nx. from_pandas_edgelist( data_iata_code_from, source= '起始列' , target= '终止列' , create_using= nx. MultiDiGraph( ) , edge_attr= True )
将度进行归一化,设置为节点大小
node_size= [ value for value in dict ( G. degree( ) ) . values( ) ]
node_size_min_max_scaler= list ( MinMaxScaler( feature_range= ( 400 , 1000 ) ) . fit_transform( pd. DataFrame( node_size) ) . reshape( 1 , - 1 ) [ 0 ] )
设置不同的节点颜色【起始节点,终止节点颜色不同】
node_color= [ 'skyblue' if key not in 起始节点列表 else 'red' for key, value in dict ( G. degree( ) ) . items( ) ]
只显示个别节点的标签名
nx. draw_networkx_labels( G, position, font_size= 25 , font_color= 'black' , labels= { iata_code: iata_code} )
设置边的标签值
edge_labels= { ( n1, n2) : label for n1, n2, label in G. edges( data= "weight" ) }
nx. draw_networkx_edge_labels( G, position, edge_labels= edge_labels, label_pos= 0.5 , font_size= 15 )
设置边的宽度
edges_width= [ float ( v[ 'weight' ] ) for ( r, c, v) in G. edges( data= True ) ]
nx. draw_networkx_edges( G, position, width= edges_width)
设置边的颜色
nx. draw( G, position,edge_color= 'black' )
添加属性值及绘制图
nx. draw_networkx_edge_labels( G, position, edge_labels= edge_labels, alpha= 0.7 , label_pos= 0.5 , font_size= 15 )
nx. draw( G, position, node_size= node_size_min_max_scaler, node_color= node_color, style= '--' , node_shape= 's' , with_labels= True , alpha= 0.6 )