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

如何在Python绘图的悬停标签中添加换行符?

解决mpld3悬停标签多行显示的问题

我帮你搞定这个问题!你遇到的核心问题是mpld3的PointLabelTooltip默认用HTML渲染标签文本,所以普通的\n换行符不会生效,得用HTML的换行标签<br>来替代。另外你的代码还有两个小问题:一是每次循环创建单独的散点对象会导致tooltip绑定冗余,二是颜色判断的条件逻辑有覆盖,我一起帮你修正了。

关键修改点

  • 把换行符\n替换成HTML的<br>标签,mpld3会解析这个标签实现换行
  • 优化散点创建逻辑:收集所有UE的坐标、颜色和标签,一次性创建散点集合,避免重复绑定tooltip
  • 修复颜色判断的条件顺序,避免颜色覆盖(比如原来小于20的点会被先后设置为绿色和橙色)

修改后的完整代码

def draw_plot(ue_info, selected_parm):
    rp_x = [-1.0,0.0,1.0,-1.0,0.0,1.0,-1.0,0.0,1.0,-1.0,0.0,1.0]
    rp_y = [1.5,1.5,1.5,0.5,0.5,0.5,-0.5,-0.5,-0.5,-1.5,-1.5,-1.5]
    Cluster = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1])
    fig = plt.figure()
    ax = fig.add_subplot(111)
    scatter = ax.scatter(rp_x, rp_y, c=Cluster, s=50)
    fig.patch.set_visible(False)
    ax.axis('off')
    ax.set_autoscale_on(False)
    ue_offset = 0.2

    # 收集所有UE的坐标、颜色和标签
    ue_x = []
    ue_y = []
    ue_colors = []
    ue_labels = []

    for ue in ue_info:
        try:
            rp_idx = int(ue_info[ue]["pr_rp_id"])
            # 生成UE的偏移坐标
            i = rand.uniform(rp_x[rp_idx]-ue_offset, rp_x[rp_idx]+ue_offset)
            j = rand.uniform(rp_y[rp_idx]-ue_offset, rp_y[rp_idx]+ue_offset)
            # 确定颜色(修复条件逻辑,用elif避免覆盖)
            parm_val = float(ue_info[ue][selected_parm])
            if parm_val < 20.0:
                color = 'green'
            elif parm_val < 21.0:
                color = 'orange'
            else:
                color = 'red'
            # 收集数据
            ue_x.append(i)
            ue_y.append(j)
            ue_colors.append(color)
            # 用<br>实现换行
            ue_label = f"UE:{ue}<br>pr_rp_id:{ue_info[ue]['pr_rp_id']}"
            ue_labels.append(ue_label)
        except Exception as e:
            print(f"One of the UE is removed while drawing the plot... Error: {e}")

    # 一次性创建所有UE的散点
    if ue_x:
        ues = ax.scatter(ue_x, ue_y, s=50, c=ue_colors, marker='+')
        # 绑定tooltip到所有UE点
        tooltip = mpld3.plugins.PointLabelTooltip(ues, labels=ue_labels)
        mpld3.plugins.connect(fig, tooltip)

    # RP点的tooltip
    tooltip_rp = mpld3.plugins.PointLabelTooltip(scatter)
    mpld3.plugins.connect(fig, tooltip_rp)

    # 添加RP标签
    rp_labels = ["RP0", "RP1", "RP2", "RP3", "RP4", "RP5",
                 "RP6", "RP7", "RP8", "RP9", "RP10", "RP11"]
    for idx, (x, y) in enumerate(zip(rp_x, rp_y)):
        plt.text(x, y + 0.2, rp_labels[idx], fontsize=8, ha='center')

    ax.set_ylim([-2,2])
    ax.set_xlim([-2,2])
    htmlGraph = mpld3.fig_to_html(fig)
    plt.close('all')
    return htmlGraph

为什么这样修改?

  1. HTML换行:mpld3的tooltip是基于浏览器的HTML渲染,所以<br>会被解析成换行,而\n只会被当成普通空格。
  2. 批量散点创建:原来的循环里每次创建一个单独的scatter,每个scatter只有一个点,导致绑定了很多重复的tooltip。现在把所有UE点放在一个scatter里,只需要绑定一次tooltip,性能更好,逻辑更清晰。
  3. 条件逻辑修复:原来的两个if会导致小于20的点先被设为绿色,然后又被第二个if覆盖成橙色,改成elif后,每个点只会匹配一个颜色条件。

这样修改后,你悬停UE点时就能看到两行的标签内容了!

内容的提问来源于stack exchange,提问作者space earth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:51:08