You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何制作双列表A、B间基于关系R分色的关联可视化图?

双向关联可视化实现方案(A-B关系连线图)

核心思路

把列表A的项固定在左侧纵坐标,列表B的项固定在右侧纵坐标,为每个(A,B)对绘制横向连线,通过R的取值(0/1/2)对应不同颜色区分关系类型。


方案1:Python + Matplotlib(静态图)

适合快速生成静态可视化,代码可复用性高。

步骤&代码

  1. 准备环境:安装依赖库
pip install matplotlib pandas
  1. 实现代码
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显示详情、缩放)的场景,生成的图可嵌入网页。

步骤&代码

  1. 安装依赖库
pip install plotly pandas
  1. 实现代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:05:27