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
相关产品推荐
相关产品推荐

