如何用Python绘制以总行数计数为总大小的treemap,解决squarify报错及加标签问题
报错原因
squarify.plot() 第一个入参要求传入仅包含数值的可迭代对象,用来定义每个区块的尺寸。你传入的example是带字符串类型索引的DataFrame结构,函数计算总尺寸时误将字符串索引纳入运算,因此触发int和str相加的类型错误。
实现方案
你做的聚合步骤是必要的,树状图需要提前得到每个类别的尺寸值才能完成布局计算,完整可运行的实现代码如下:
import pandas as pd import squarify import matplotlib.pyplot as plt # 原始示例数据 df = pd.DataFrame({'fruit': ['apple', 'apple', 'kiwi'], 'color': ['red', 'green', 'green']}) # 按color聚合计数 example = (df["color"].value_counts()).rename_axis("fruit_color").to_frame("count") # 提取纯数值的计数序列作为区块尺寸 sizes = example['count'].values # 自定义标签:同时展示类别、计数、百分比 labels = [f"{color}\n{cnt}\n{cnt/sum(sizes)*100:.1f}%" for color, cnt in zip(example.index, example['count'])] # 绘图配置 plt.figure(figsize=(6, 4)) squarify.plot( sizes=sizes, label=labels, alpha=0.8, text_kwargs={'fontsize': 10, 'color': 'white'} ) # 隐藏坐标轴提升美观度 plt.axis('off') plt.title('颜色分布占比树状图') plt.show()
自定义调整说明
- 若不需要百分比标签,可将标签生成逻辑修改为:
labels = [f"{color}\n{cnt}" for color, cnt in zip(example.index, example['count'])] - 可通过调整
text_kwargs参数修改标签的字体大小、颜色等样式
内容的提问来源于stack exchange,提问作者Jurij
相关产品推荐
相关产品推荐

