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

Python绘制多直方图报错:TypeError: len() of unsized object

解决plt.hist绘制多直方图时的TypeError问题

嘿,我刚碰到过一模一样的问题!你这个TypeError: len() of unsized object的根源很简单:当你用df2[['X1']]这种双括号的写法时,取出来的是二维的DataFrame对象,而plt.hist函数需要的是一维的数值序列(比如pandas的Series或者numpy的一维数组)。matplotlib没法识别二维结构的长度,自然就报错了。

给你几个直接可行的解决方案:

方案1:改用Series提取列(最推荐)

把双括号改成单括号,直接获取列对应的Series,这是最简洁的方式:

import pandas as pd
import matplotlib.pyplot as plt

# 先还原你的示例数据
df = pd.DataFrame({
    'ID': [0, 1, 2, 3],
    'X1': [3969518, 8111123, 250000, 10745929],
    'X2': [24700, 20000, 987000, 5000]
})

# 用单括号取Series,而不是双括号的DataFrame
x1 = df['X1']
x2 = df['X2']

# 注意:新版本matplotlib里normed=True已经被弃用,换成density=True更稳妥
kwargs = dict(histtype='stepfilled', alpha=0.3, density=True, bins=20)
plt.hist(x1, **kwargs)
plt.hist(x2, **kwargs)
plt.legend(['X1', 'X2'])  # 加个图例区分两组数据
plt.show()

方案2:展平DataFrame为一维数组

如果你因为某些原因必须用双括号取DataFrame,可以用.values.flatten()把二维数组压成一维:

x1 = df[['X1']].values.flatten()
x2 = df[['X2']].values.flatten()

# 后续代码和方案1一致
kwargs = dict(histtype='stepfilled', alpha=0.3, density=True, bins=20)
plt.hist(x1, **kwargs)
plt.hist(x2, **kwargs)
plt.legend(['X1', 'X2'])
plt.show()

额外福利:用seaborn更高效绘制

既然你提到了想用seaborn,其实可以把数据转成长格式后,用seaborn一键生成分组直方图,完全不用手动处理维度问题:

import seaborn as sns

# 把宽格式数据转成长格式(melt操作)
df_melted = df.melt(id_vars='ID', value_vars=['X1', 'X2'], var_name='变量', value_name='数值')

# seaborn会自动处理分组和图例
sns.histplot(
    data=df_melted,
    x='数值',
    hue='变量',
    bins=20,
    alpha=0.3,
    element='poly',  # 对应stepfilled的效果
    stat='density'   # 归一化到密度,和density=True一致
)
plt.show()

内容的提问来源于stack exchange,提问作者Ian Okeyo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:31:28