Plotly绘图中按样本前缀统一线条颜色的技术需求
实现相同前缀样本线条统一颜色的解决方案
要让具有相同前缀的样本使用统一颜色,你可以通过前缀-颜色映射字典绑定对应关系,在循环添加 trace 时根据样本名称的前缀匹配颜色即可,具体修改如下:
步骤1:定义前缀与颜色的映射关系
先创建字典,将需要分组的前缀和对应颜色关联起来。既可以自定义颜色,也可以直接用 Plotly 内置的定性色板快速分配:
# 自定义前缀-颜色映射(示例) prefix_colors = { "SA": "#1f77b4", # 蓝色 "Bulk": "#ff7f0e", # 橙色 "Continental": "#2ca02c" # 绿色 } # 或用Plotly内置色板自动分配(更快捷) from plotly.colors import qualitative prefixes = ["SA", "SampleX", "GroupY"] prefix_colors = {p: qualitative.Plotly[i] for i, p in enumerate(prefixes)}
步骤2:修改循环添加trace的逻辑
在遍历样本的循环中,提取当前样本的前缀,从映射字典中获取对应颜色,将其设置到线条的color参数中:
for i, age_value in enumerate(age): sample_name = samples[i] # 提取前缀:这里以"开头前2个字符"为例,可根据你的样本命名规则调整 # 比如样本名是SA-123/SA_456,可改为 prefix = sample_name.split("-")[0] 或 split("_")[0] prefix = sample_name[:2] # 获取对应颜色,若前缀不在映射中则用灰色作为默认 line_color = prefix_colors.get(prefix, "#7f7f7f") a = [sri[i], srm[i]] b = [-(age_value), 0] fig2.add_trace(go.Scatter( x=b, y=a, mode='lines', name=sample_name, line=dict(color=line_color) # 绑定线条颜色 ))
完整修改后的代码
整合后的代码如下:
import plotly.graph_objects as go import plotly.express as px from plotly.colors import qualitative fig2 = px.scatter() fig2.add_trace(go.Scatter(x=x1, y=y1, mode='lines', name='Mantle Growth Curve', )) fig2.add_trace(go.Scatter(x=x2, y=y2, mode='lines', name='Bulk Earth')) fig2.add_trace(go.Scatter(x=x3, y=y3, mode='lines', name='Continental crust Rb/Sr = 0.17')) # 定义前缀-颜色映射(根据你的实际样本前缀调整) prefixes = ["SA", "OtherPrefix1", "OtherPrefix2"] prefix_colors = {p: qualitative.Plotly[i] for i, p in enumerate(prefixes)} for i, age_value in enumerate(age): sample_name = samples[i] # 提取前缀:根据你的样本命名规则修改提取逻辑 prefix = sample_name[:2] line_color = prefix_colors.get(prefix, "#7f7f7f") a = [sri[i], srm[i]] b = [-(age_value), 0] fig2.add_trace(go.Scatter( x=b, y=a, mode='lines', name=sample_name, line=dict(color=line_color) )) fig2.update_layout( xaxis=dict( title='Age (Ga)', range=[-4.5, 0] ), yaxis=dict( title='87Sr/86Sr', range=[0.65, 0.9] ) ) fig2.update_layout( template=large_rockwell_template ) fig2.show()
注意事项
- 前缀提取逻辑需要根据你的实际样本命名规则调整:如果样本名是
SA-123、SA-456,可以用sample_name.split("-")[0]提取前缀;如果是SA123、SA456,则用sample_name[:2]即可。 - 如果有新增的前缀,只需在
prefixes列表中添加,内置色板会自动分配新的颜色,无需手动指定。
内容的提问来源于stack exchange,提问作者guilherme loriato potratz
相关产品推荐
相关产品推荐

