如何在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
为什么这样修改?
- HTML换行:mpld3的tooltip是基于浏览器的HTML渲染,所以
<br>会被解析成换行,而\n只会被当成普通空格。 - 批量散点创建:原来的循环里每次创建一个单独的scatter,每个scatter只有一个点,导致绑定了很多重复的tooltip。现在把所有UE点放在一个scatter里,只需要绑定一次tooltip,性能更好,逻辑更清晰。
- 条件逻辑修复:原来的两个
if会导致小于20的点先被设为绿色,然后又被第二个if覆盖成橙色,改成elif后,每个点只会匹配一个颜色条件。
这样修改后,你悬停UE点时就能看到两行的标签内容了!
内容的提问来源于stack exchange,提问作者space earth
相关产品推荐
相关产品推荐

