如何为Plotly px.treemap的外层方块添加中间文本?
为Plotly Treemap外层方块添加文本的可行方案
完全可行,你可以复用现有逻辑,针对所有层级(包括外层)的节点配置文本,核心是确保customdata覆盖所有节点,同时通过texttemplate控制显示内容。
- 关键逻辑:Plotly Treemap的所有节点(无论外层还是内层)都统一存储在
fig.data[0]中,因此只要customdata数组的长度与节点总数匹配,每个节点(包括外层)都会对应到自定义数据。 - 具体步骤:
- 生成覆盖所有层级节点的
customdata数组:根据节点的层级(可通过fig.data[0].ids获取每个节点的层级路径),计算或准备对应需要显示的文本内容。 - 配置
texttemplate:可以直接引用%{customdata},也可结合%{label}、%{depth}等内置变量,甚至通过条件判断区分外层和内层的显示格式。
- 生成覆盖所有层级节点的
示例代码
import plotly.express as px # 示例数据 df = px.data.tips() fig = px.treemap(df, path=['day', 'time'], values='total_bill') # 获取所有节点的ID,用于区分层级 node_ids = fig.data[0].ids customdata_list = [] # 为每个节点(外层+内层)生成自定义文本 for node_id in node_ids: path_parts = node_id.split('>') if len(path_parts) == 1: # 外层节点:计算该日期的平均账单 avg_bill = df[df['day'] == path_parts[0]]['total_bill'].mean() custom_text = f"平均账单: ${avg_bill:.2f}" else: # 内层节点:计算该日期+时段的平均账单 avg_bill = df[(df['day'] == path_parts[0]) & (df['time'] == path_parts[1])]['total_bill'].mean() custom_text = f"平均账单: ${avg_bill:.2f}" customdata_list.append(custom_text) # 绑定自定义数据 fig.data[0].customdata = customdata_list # 设置文本模板,同时显示标签和自定义内容 fig.data[0].texttemplate = "%{label}<br>%{customdata}" # 若需区分外层和内层显示格式,可使用条件表达式 # fig.data[0].texttemplate = "{%{depth} == 0 ? '【外层】' + %{label} + '<br>' + %{customdata} : '【内层】' + %{label} + '<br>' + %{customdata}}" fig.show()
说明
%{depth}变量可用于判断节点层级:最外层节点的depth为0,内层节点依次递增。- 确保
customdata_list的长度与fig.data[0].ids的长度一致,每个索引对应一个节点。
内容的提问来源于stack exchange,提问作者J Agustin Barrachina
相关产品推荐
相关产品推荐

