【问题标题】:Make edges thicker in NetworkX在 NetworkX 中使边缘变粗
【发布时间】:2022-10-24 11:34:49
【问题描述】:
  student_id  0   1   2   3   4   5   6   7   8   9  10  11  12
0   131X1319  1  14   6  16   1  10   8  15  15  17  15  18  16
1   13212YX3  1   1   4   8  11   9  14   7   0   3   0  17  13
2   13216131  1   1  13   9  15  17   0   9   3  15  11   8  10
3   132921W6  1  14  10   4  18   7   8  15  15  17  15  18  16

我有一个这样的数据框。我想用networkX制作一个图表。而且我想让边缘每次从一个节点到另一个节点时变厚。认为,
15->15->17->15->18->16
在数据框中出现两次。所以,我想将厚度增加到两个。我制作了普通图,但无法增加图的厚度。 这是我创建普通图的代码:

columns=list(pattern_df.columns.values)
pattern_g = nx.empty_graph(0, nx.DiGraph())
for i in range(len(columns)-1):
     pattern_g.add_edges_from(zip(pattern_df[columns[i]], 
pattern_df[columns[i+1]]))
sum_val=pattern_df.sum(numeric_only=True, axis=0)
values = [sum_val.get(node, 0.25) for node in pattern_g.nodes()]
nx.draw(pattern_g, with_labels=True, font_color='black')
plt.show()

这是我为样本数据生成的图表:

【问题讨论】:

  • 请提供足够的代码,以便其他人可以更好地理解或重现该问题。
  • 你是指绘图时的线条粗细吗?
  • 是的。我想增加从一个节点到另一个节点的厚度。
  • 你能修复你发布的代码的缩进吗?
  • 对不起。修复了缩进

标签: python pandas graph networkx data-analysis


【解决方案1】:

你在解释你想要做什么方面做得很糟糕。此外,如果您提供了可以使用简单复制和粘贴的代码,那就太好了。

我怀疑你的想法是这样的。

而且我想让边缘每次从一个节点到另一个节点时变厚。认为那个序列 15 15 17 15 18 16出现在两个不同的行在数据框中。所以,我想增加厚度每个边对应于该序列中的连续对,即15->15, 15->17, 17->15 等等.

您的解释没有说明如果同一对在同一行中多次出现会发生什么;我认为这样的重复应该单独计入该边缘的厚度。

这是一些代码如果您只是简单地复制并粘贴它并尽我所能猜测您要做什么(即假设我的解释是正确的),则可以工作。

from collections import Counter
import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt

# Reconstruct the dataframe from its inconvenient format
df_str = '''  student_id  0   1   2   3   4   5   6   7   8   9  10  11  12
0   131X1319  1  14   6  16   1  10   8  15  15  17  15  18  16
1   13212YX3  1   1   4   8  11   9  14   7   0   3   0  17  13
2   13216131  1   1  13   9  15  17   0   9   3  15  11   8  10
3   132921W6  1  14  10   4  18   7   8  15  15  17  15  18  16
'''
lines = df_str.splitlines()
cols = lines[0].split()
data = [line.split()[1:] for line in lines[1:]]
pattern_df = pd.DataFrame(data,columns = cols)

# Count appearance of each edge
columns=list(pattern_df.columns.values)
ct = Counter(p for i in range(len(columns)-1) 
               for p in zip(pattern_df[columns[i]],pattern_df[columns[i+1]]))

# Build associated graph
pattern_g = nx.DiGraph()
pattern_g.add_edges_from(ct)

# Draw graph, using frequency of each pair as edge-width
width = [ct[p] for p in pattern_g.edges] 
nx.draw(pattern_g, node_color = 'orange', with_labels=True, width = width)
plt.show()

这是结果。


关于您的评论:您可以对我建议的脚本的图形构建部分进行以下更改。

# Build associated graph
pattern_g = nx.DiGraph()
for e,v in ct.items():
    pattern_g.add_edge(*e, weight=v)

【讨论】:

  • 嘿。抱歉,问题发布得不好。我是 StackOverflow 的新手。不过谢谢你的建议。这就是我想做的。再次感谢。
  • @blackstreetboy 对不起,如果我在这里有点敌意;我很乐意提供帮助。为了将来参考,使数据框直接可供其他用户使用的一种有用方法是将[DataFrame].head().to_dict() 的结果粘贴到您的问题中。这样,pd.DataFrame(d)(其中 d 是粘贴的字典)是一个可用的数据框。
  • 嗨..我收到一个错误“AttributeError: 'DataFrame' object has no attribute 'splitlines'”
  • @BenGrossmann 您在 SO 上大多数时候都会得到这样的数据。看看pd.read_clipboard 在这里工作得很好。还有pd.read_tableio.StringIO 作为缓冲区是可能的(我用它来从大多数问题中创建数据)
  • @Rabinzel 我不知道 read_clipboard 命令,太棒了!谢谢你。
猜你喜欢
  • 2022-11-11
  • 1970-01-01
  • 2018-04-16
  • 2023-02-25
  • 1970-01-01
  • 2021-06-03
  • 2021-10-31
  • 2013-03-16
  • 1970-01-01
相关资源
最近更新 更多