excel中有source,target,values数据,绘制Python弦图
时间: 2024-03-09 11:46:58 浏览: 132
在 Python 中,可以使用 `pandas` 和 `plotly` 库来绘制弦图。首先,我们需要读取包含 `source`、`target` 和 `values` 数据的 Excel 文件,并将数据转换为适合绘制弦图的形式。具体来说,我们需要将 `source` 和 `target` 转换为唯一的节点列表,然后使用这些节点的名称构建一个邻接矩阵,矩阵中的值为 `values`。
以下是一个示例代码,可以读取 Excel 文件并绘制弦图:
```python
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 读取 Excel 文件数据
df = pd.read_excel('data.xlsx')
# 获取唯一的节点列表
nodes = sorted(list(set(df['source'].tolist() + df['target'].tolist())))
# 构建邻接矩阵
adj_matrix = [[0] * len(nodes) for _ in range(len(nodes))]
for _, row in df.iterrows():
i = nodes.index(row['source'])
j = nodes.index(row['target'])
adj_matrix[i][j] = row['values']
adj_matrix[j][i] = row['values']
# 绘制弦图
fig = make_subplots(rows=1, cols=1)
fig.add_trace(go.Sankey(
node=dict(
pad=15,
thickness=20,
line=dict(color="black", width=0.5),
label=nodes
),
link=dict(
source=[i for i in range(len(nodes)) for j in range(len(nodes)) if i != j and adj_matrix[i][j] > 0],
target=[j for i in range(len(nodes)) for j in range(len(nodes)) if i != j and adj_matrix[i][j] > 0],
value=[adj_matrix[i][j] for i in range(len(nodes)) for j in range(len(nodes)) if i != j and adj_matrix[i][j] > 0]
)
))
fig.update_layout(title_text="Chord Diagram")
fig.show()
```
在上述代码中,我们首先使用 `pandas` 库的 `read_excel` 函数读取包含数据的 Excel 文件。接着,我们使用 `set` 函数和 `tolist` 方法获取唯一的节点列表。然后,我们构建一个空的邻接矩阵,并遍历数据框中的每一行,将 `source` 和 `target` 对应的值转换为矩阵中的行和列索引,然后将 `values` 存储在相应的矩阵元素中。最后,我们使用 `make_subplots` 函数创建一个子图,使用 `go.Sankey` 函数绘制弦图,其中 `node` 参数指定节点的属性,`link` 参数指定边的属性。我们使用列表推导式来构建 `source`、`target` 和 `value` 列表,其中 `i` 和 `j` 分别表示矩阵的行和列索引,如果 `adj_matrix[i][j]` 大于 0,则说明节点 i 和节点 j 之间存在一条边,并将其添加到对应的列表中。最后,我们使用 `update_layout` 函数添加标题,并使用 `show` 函数显示弦图。
阅读全文