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

Plotly散点图:修改单个数据点的颜色、标记大小及名称

解决Plotly散点图单个数据点样式修改问题

你的代码不生效的核心原因是:Plotly Express生成的散点图默认将所有数据点放在同一个trace中,trace.name对应的是整个数据系列的名称(而非单个数据点的索引名),所以trace.name == 'one'的判断永远不成立,自然无法修改目标点的样式。

下面提供两种实用的解决方法,按需选择:

方法一:拆分Trace,单独绘制特殊点

将目标点从原数据中分离,单独作为一个新trace添加到图表中,这样可以完全独立控制它的颜色、大小、标记形状和名称:

import plotly.express as px
import pandas as pd

df1 = pd.DataFrame(index=['one','two','three','four'],
                   data=[[3,4],[2,5],[2,3],[6,4]],
                   columns=['a','b'])

# 先绘制除"one"外的普通数据点
fig1 = px.scatter(df1.drop('one'), x="a", y="b", text=df1.drop('one').index.astype(str))
# 添加"one"这个特殊点,自定义样式
fig1.add_scatter(
    x=[df1.loc['one','a']],
    y=[df1.loc['one','b']],
    text=['one'],
    marker=dict(color='#ff4d4d', size=18, symbol='square'),  # 自定义颜色、大小、标记
    name='特殊点one'  # 设置该点的系列名称
)
# 统一设置文本位置
fig1.update_traces(textposition='top center')
fig1.show()

方法二:在单个Trace中修改单个点属性

利用Plotly支持为marker的color/size/symbol参数传入列表的特性,为每个点单独指定样式,无需拆分trace:

import plotly.express as px
import pandas as pd

df1 = pd.DataFrame(index=['one','two','three','four'],
                   data=[[3,4],[2,5],[2,3],[6,4]],
                   columns=['a','b'])

fig1 = px.scatter(df1, x="a", y="b", text=df1.index.astype(str))

# 为每个点定义样式规则
symbols = ['square' if idx == 'one' else 'circle' for idx in df1.index]
colors = ['#ff4d4d' if idx == 'one' else '#1f77b4' for idx in df1.index]
sizes = [18 if idx == 'one' else 10 for idx in df1.index]
# 自定义单个点的显示文本(可选)
custom_text = [f'重点:{idx}' if idx == 'one' else idx for idx in df1.index]

# 应用样式修改
fig1.update_traces(
    marker=dict(symbol=symbols, color=colors, size=sizes),
    text=custom_text,
    textposition='top center'
)
fig1.show()

两种方法对比

  • 方法一:适合需要给特殊点单独设置图例、hover提示框等独立属性的场景
  • 方法二:适合保持数据系列完整性,不想拆分trace的场景

内容的提问来源于stack exchange,提问作者Martin Yordanov Georgiev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:02:55