如何制作双列表A、B间基于关系R分色的关联可视化图?
双向关联可视化实现方案(A-B关系连线图)
核心思路
把列表A的项固定在左侧纵坐标,列表B的项固定在右侧纵坐标,为每个(A,B)对绘制横向连线,通过R的取值(0/1/2)对应不同颜色区分关系类型。
方案1:Python + Matplotlib(静态图)
适合快速生成静态可视化,代码可复用性高。
步骤&代码
- 准备环境:安装依赖库
pip install matplotlib pandas
- 实现代码
import matplotlib.pyplot as plt import pandas as pd # 加载示例数据 data = pd.DataFrame([ ["A1", "B1", 0], ["A1", "B2", 2], ["A1", "B3", 0], ["A2", "B1", 1], ["A2", "B2", 0], ["A2", "B3", 1], ["A3", "B1", 0], ["A3", "B2", 0], ["A3", "B3", 2] ], columns=["A", "B", "R"]) # 定义A/B项的位置映射(确保左右项一一对应纵坐标) a_items = sorted(data["A"].unique()) b_items = sorted(data["B"].unique()) y_pos = {item: i for i, item in enumerate(a_items)} # 定义颜色映射:R值对应不同颜色 color_map = {0: "#888888", 1: "#3399FF", 2: "#FF6666"} # 创建画布 fig, ax = plt.subplots(figsize=(6, 3)) # 绘制每条连线 for _, row in data.iterrows(): a_y = y_pos[row["A"]] b_y = y_pos[row["B"]] # 因为A和B的项数量一致,直接复用位置映射 # 绘制横向连线 ax.plot([0, 1], [a_y, b_y], color=color_map[row["R"]], linewidth=2) # 设置左侧y轴(A项) ax.set_yticks(list(y_pos.values())) ax.set_yticklabels(a_items) ax.set_ylim(-0.5, len(a_items)-0.5) # 添加右侧y轴(B项) ax2 = ax.twinx() ax2.set_yticks(list(y_pos.values())) ax2.set_yticklabels(b_items) ax2.set_ylim(-0.5, len(a_items)-0.5) # 隐藏x轴刻度和边框 ax.set_xticks([]) ax.spines[["top", "bottom", "left", "right"]].set_visible(False) # 添加图例 from matplotlib.patches import Patch legend_elements = [Patch(facecolor=color_map[r], label=f"R={r}") for r in color_map] ax.legend(handles=legend_elements, loc="upper center", bbox_to_anchor=(0.5, 1.15), ncol=3) plt.tight_layout() plt.show()
方案2:Python + Plotly(交互式图)
适合需要交互查看(hover显示详情、缩放)的场景,生成的图可嵌入网页。
步骤&代码
- 安装依赖库
pip install plotly pandas
- 实现代码
import plotly.graph_objects as go import pandas as pd # 加载示例数据 data = pd.DataFrame([ ["A1", "B1", 0], ["A1", "B2", 2], ["A1", "B3", 0], ["A2", "B1", 1], ["A2", "B2", 0], ["A2", "B3", 1], ["A3", "B1", 0], ["A3", "B2", 0], ["A3", "B3", 2] ], columns=["A", "B", "R"]) # 定义位置映射和颜色映射 a_items = sorted(data["A"].unique()) b_items = sorted(data["B"].unique()) y_pos = {item: i for i, item in enumerate(a_items)} color_map = {0: "#888888", 1: "#3399FF", 2: "#FF6666"} # 创建图形对象图 fig = go.Figure() # 添加连线轨迹 for _, row in data.iterrows(): fig.add_trace(go.Scatter( x=[0, 1], y=[y_pos[row["A"]], y_pos[row["B"]]], mode="lines", line=dict(color=color_map[row["R"]], width=3), name=f"R={row['R']}", hovertemplate=f"A: {row['A']}<br>B: {row['B']}<br>R: {row['R']}<extra></extra>" )) # 设置布局 fig.update_layout( yaxis=dict( tickmode="array", tickvals=list(y_pos.values()), ticktext=a_items, range=[-0.5, len(a_items)-0.5] ), yaxis2=dict( tickmode="array", tickvals=list(y_pos.values()), ticktext=b_items, range=[-0.5, len(a_items)-0.5], overlaying="y", side="right" ), xaxis=dict(showticklabels=False, range=[-0.1, 1.1]), showlegend=True, legend=dict(x=0.5, y=1.1, xanchor="center", orientation="h"), width=600, height=300, margin=dict(l=50, r=50, t=50, b=20) ) fig.show()
方案3:低代码工具(Excel/Tableau)
Excel实现思路
- 将A、B项的位置用数字编码(比如A1=0,A2=1,A3=2;B1=0,B2=1,B3=2)
- 插入散点图,添加两组数据:左侧点(x=0, y=编码)、右侧点(x=1, y=编码)
- 插入形状(直线),连接对应左右点,根据R值设置直线颜色
- 隐藏散点标记,调整坐标轴标签为A/B项名称
Tableau实现思路
- 导入数据,将A、B转为维度,R转为度量
- 创建计算字段:
X_A = 0,X_B = 1,Y = INDEX()(按A/B项排序后分配纵坐标) - 拖入
X_A和Y到行/列,添加A到标签;再拖入X_B和Y到行/列,添加B到标签 - 使用线图连接对应点,将
R拖到颜色标记,设置颜色映射
内容的提问来源于stack exchange,提问作者ocuti
相关产品推荐
相关产品推荐

