【发布时间】:2021-12-28 00:37:47
【问题描述】:
我重新发布这个问题,因为我没有在上一个问题中制作好的示例代码。
我正在尝试将节点设置在特定位置。 但我发现输出图不是……固定的。让我给你看照片。
所以这是我用 10 个节点制作的。按照我的预期完美地工作。 它的左下角还有 plt.text。
这是另一张照片
如您所见,出了点问题。 plt.text 不见了,美国的位置很奇怪。实际上,该位置是第一张照片中 DEU 所在的位置。两张图片使用相同的代码。
现在,让我向您展示我的一些代码。 对于 spec_df,请从我的 gdrive 下载: https://drive.google.com/drive/folders/11X_i5-pRLGBfQ9vIwQ3hfDU5EWIfR3Uo?usp=sharing
auto_flag = 0
spec_df=pd.read_stata("C:\\"Your_file_loc"\\CombinedHS6_example.dta")
#top_10_list = ["USA","CHN","KOR"] (Try for three nodes)
#or
#auto_flag = 1 (Try for 10 nodes)
df_p = spec_df[['partneriso3','tradevalue']]
df_p = df_p.groupby('partneriso3').sum().reset_index()
df_r = spec_df[['reporteriso3','tradevalue']]
df_r = df_r.groupby('reporteriso3').sum().reset_index()
df_r = df_r.rename(columns={'reporteriso3': 'Nation'})
df_r = df_r.rename(columns={'tradevalue': 'tradevalue_r'})
df_p = df_p.rename(columns={'partneriso3': 'Nation'})
df_s = pd.merge(df_r, df_p, on='Nation', how='outer').fillna(0)
df_s["final"] = df_s['tradevalue'] + df_s['tradevalue_r']
if auto_flag == 1:
df_s = df_s.sort_values(by=['final'], ascending = False).reset_index()
cut = df_s[:10]
else:
cut = df_s[(df_s['Nation'].isin(top_10_list))]
cut['final'] = cut['final'].apply(lambda x: normalize(x, cut['final'].max()))
cut['font_size'] = cut['final'] * 13
cut['final'] = cut['final'] * 1500
top_10_list = list(cut["Nation"])
top10 = spec_df[(spec_df['reporteriso3'].isin(top_10_list))&(spec_df['partneriso3'].isin(top_10_list))]
top10['tradevalue'] = top10['tradevalue'].apply(lambda x: normalize(x, top10['tradevalue'].max()))
top10['tradevalue'] = top10['tradevalue']*10
plt.figure(figsize=(10,10), dpi = 100)
G = nx.from_pandas_edgelist(top10, 'reporteriso3', 'partneriso3', 'tradevalue', create_using= nx.DiGraph())
widths = nx.get_edge_attributes(G,'tradevalue')
pos = {}
pos_cord = [(-0.30779309, -0.26419882), (0.26767895, 0.19524759), (-0.38479095, 0.88179998), (0.33785317, 0.96090914), (0.94090464, 0.40707934), (0.9270665, -0.38403114), (0.41246223, -0.85684049), (-0.32083322, -1.0), (-0.99724456, -0.34947554), (-0.87530367, 0.40950993)]
for t in range(len(top_10_list)):
if top_10_list == "":
continue
else:
pos[top_10_list[t]] = pos_cord[t]
pos_nodes = nudge(pos, 0, 0.12)
nx.draw_networkx_edges(G,pos, width=list(widths.values()), edge_color = '#9ECAE4')
nx.draw_networkx_nodes(G, pos=pos, nodelist = cut['Nation'], node_size= cut['final'], node_color ='#AB89EF', edgecolors ='#000000')
nx.draw_networkx_labels(G,pos_nodes, font_size=15)
plt.text(-1.15,-1.15,s='hs : ')
plt.savefig(location,dpi=300)
对不起,粗略的代码。但我想问一下我使用的是固定坐标。所以节点不应该移动到那里。所以我认为 plt 的大小有点与内容交互......?但我不知道它是怎么做到的。
有谁能给我指点一下吗?这让我抓狂...
【问题讨论】:
-
networkx根据图的内容调整轴的大小。我也不喜欢这种行为。但是,您可以通过显式设置 x 和 y 限制轻松解决此问题。 -
@PaulBrodersen 感谢保罗的评论。你能告诉我该怎么做吗?我发现
networkx.draw_networkx_nodes中有margins参数,它处理填充。它有所帮助,但尚未产生完全相同的结果。 -
@PaulBrodersen 非常感谢我的才华横溢的先生。它确实帮助并解决了问题!
标签: python-3.x matplotlib networkx