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

如何用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 实现所有要求

核心实现逻辑

  1. 直接用原始DF生成热力图:通过x/y/z参数指定对应列,无需手动做透视表
  2. 带%的百分比标注:用text_auto参数自动格式化数值为百分比格式
  3. 单元格分隔:通过调整坐标轴网格线+背景色模拟分隔效果

代码示例

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 实现所有要求

核心实现逻辑

  1. 直接用原始DF生成热力图:代码内自动将长格式DF转成透视表,无需手动预处理
  2. 单元格分隔:直接用xgap/ygap参数设置单元格间隙(单位像素)
  3. 带%的百分比标注:先将数值格式化为带%的字符串,再通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:45:04