如何基于列值为Plotly折线图设置渐变颜色?
解决Plotly实现按列序号渐变颜色折线图的问题
错误原因分析
你使用px.line时出现长度不匹配错误,核心原因是Plotly Express更适配长格式数据,而你的DataFrame是宽格式(每列对应一条折线)。df.columns仅包含10个元素,但x=df.index和y对应的是1000行数据,参数长度不一致导致报错。
复刻Matplotlib渐变效果的Plotly实现
要实现和Matplotlib一致的按列序号渐变颜色折线图,需先将宽格式数据转为长格式,再用Plotly Express绘制:
import pandas as pd import numpy as np import plotly.express as px # 生成原始DataFrame df = pd.DataFrame( data=np.cumsum( np.sqrt(1 / 1000) * np.random.normal(size=(1000, 10)), axis=0), columns=np.array([*range(1, 11)])) # 将宽格式转为长格式 df_melt = df.reset_index().melt( id_vars='index', var_name='Signal Number', value_name='Value' ) # 绘制渐变颜色折线图 fig = px.line( df_melt, x='index', y='Value', color='Signal Number', color_continuous_scale='viridis', # 和Matplotlib的viridis色阶匹配 labels={'index': '索引', 'Value': '数值'} ) # 自定义颜色条标题 fig.update_layout(coloraxis_colorbar=dict(title='信号编号')) fig.show()
实现自定义分段颜色(1-3黄、4-7橙、8-10红)
如果需要按指定区间设置固定颜色,可以通过自定义颜色映射实现:
# 定义分段颜色映射 color_map = { **{str(i): '#f9e047' for i in range(1,4)}, # 1-3列用黄色 **{str(i): '#ff9d48' for i in range(4,8)}, # 4-7列用橙色 **{str(i): '#ff4b47' for i in range(8,11)} # 8-10列用红色 } fig = px.line( df_melt, x='index', y='Value', color='Signal Number', color_discrete_map=color_map, labels={'index': '索引', 'Value': '数值'} ) fig.show()
关键说明
- 长格式转换:
melt函数将每列的折线数据转为行记录,让每个数据点都携带对应的列序号,确保color参数能正确匹配颜色依据。 - 连续色阶:
color_continuous_scale参数可实现和Matplotlib一致的渐变效果,同时自动生成对应颜色条。 - 分段配色:
color_discrete_map参数可以为指定列序号绑定固定颜色,满足自定义区间的配色需求。
内容的提问来源于stack exchange,提问作者alpastor
相关产品推荐
相关产品推荐

