matplotlib 的 networkx 输出比例问题 (re-post)

networkx output scale problem with matplotlib (re-post)

我re-posting这个问题是因为我在上一题中没有写出很好的示例代码。

我正在尝试将节点设置在特定位置。 但是我发现输出图不是...固定的。让我给你看照片。

这是我用 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 的大小有点与内容相互作用......?但是我不知道它是怎么做到的。

谁能赐教一下?这让我发疯...

感谢@Paul Brodersen 的评论,我找到了修复位置的方法。

我刚刚在我的代码中添加了这些代码。

fig = plt.figure(figsize=(10,10), dpi = 100)
axes = fig.add_axes([0,0,1,1])
axes.set_xlim([-1.3,1.3])
axes.set_ylim([-1.3,1.3])

再次感谢您的帮助!