如何用Plotly从Pandas DataFrame生成带百分比标注及单元格分隔的热力图
Plotly 热力图实现方案(基于原始DataFrame)
先准备示例数据,和你手上的DataFrame结构一致:
import pandas as pd import plotly.express as px import plotly.graph_objects as go # 示例数据,替换成你的实际DataFrame即可 df = pd.DataFrame({ 'Day': ['周一', '周一', '周二', '周二', '周三', '周三'], 'Time': ['午餐', '晚餐', '午餐', '晚餐', '午餐', '晚餐'], 'PizzaConsumptionFraction': [0.25, 0.4, 0.3, 0.35, 0.2, 0.5] })
一、用 Plotly Express 实现所有要求
核心实现逻辑
- 直接用原始DF生成热力图:通过
x/y/z参数指定对应列,无需手动做透视表 - 带%的百分比标注:用
text_auto参数自动格式化数值为百分比格式 - 单元格分隔:通过调整坐标轴网格线+背景色模拟分隔效果
代码示例
fig = px.imshow( df, x='Time', y='Day', z='PizzaConsumptionFraction', text_auto='.1%', # 自动生成带%的标注,保留1位小数 aspect='auto' # 自动适配单元格宽高 ) # 模拟单元格分隔:调粗网格线,用颜色区分 fig.update_layout( xaxis=dict( gridwidth=2, gridcolor='white', # 网格线设为白色 tickmode='array', tickvals=df['Time'].unique() ), yaxis=dict( gridwidth=2, gridcolor='white', tickmode='array', tickvals=df['Day'].unique() ), paper_bgcolor='#f0f0f0' # 背景设为浅灰,白色网格线就成了分隔线 ) fig.show()
针对你的问题:Plotly Express 如何添加单元格分隔?
Plotly Express没有原生的间隙参数,可通过网格线+背景色的组合模拟:把网格线调粗、设为和背景反差大的颜色,就能让网格线变成单元格之间的分隔线,效果和直接加间隙一致。
二、用 Plotly Graph Objects 实现所有要求
核心实现逻辑
- 直接用原始DF生成热力图:代码内自动将长格式DF转成透视表,无需手动预处理
- 单元格分隔:直接用
xgap/ygap参数设置单元格间隙(单位像素) - 带%的百分比标注:先将数值格式化为带%的字符串,再通过
text/texttemplate参数添加
代码示例
# 代码内自动转换为透视表,无需手动处理 pivot_df = df.pivot(index='Day', columns='Time', values='PizzaConsumptionFraction') fig = go.Figure(data=go.Heatmap( z=pivot_df.values, x=pivot_df.columns, y=pivot_df.index, xgap=5, # x方向单元格间隙 ygap=5, # y方向单元格间隙 # 生成带%的标注文本 text=pivot_df.applymap(lambda x: f'{x*100:.1f}%'), texttemplate='%{text}', # 显示自定义的百分比文本 textfont=dict(size=12) )) fig.update_layout( xaxis_title='时段', yaxis_title='日期' ) fig.show()
针对你的问题:Plotly Graph Objects 设置xgap/ygap后,如何添加百分比格式标注?
先把原始小数数据转换为带%的字符串(比如用applymap把数值乘100后格式化),然后将这个字符串矩阵传入text参数,再设置texttemplate='%{text}'即可。xgap/ygap的设置不会影响标注位置,标注会自动对应到每个单元格的中心。
内容的提问来源于stack exchange,提问作者MVKXXX
相关产品推荐
相关产品推荐

