Python Seaborn Catplot报错:‘NoneType’对象无len()方法
Seaborn catplot绘制计数图报错的原因及解决方法
问题场景
现有分类数据如下(pandas Series):
import pandas as pd data = pd.Series(["NY", "NY", "CL", "TX", "CL", "FL", "NY", "FL"])
尝试用Seaborn的catplot绘制计数图:
import seaborn as sns import matplotlib.pyplot as plt sns.catplot(x=data, kind="count")
出现如下错误:
Traceback (most recent call last): File "C:\Users\%USERNAME%\PycharmProjects\Troubleshooting\temp.py", line 6, in <module> sns.catplot(x=my_data, kind="count") File "C:\Users\%USERNAME%\Troubleshooting\lib\site-packages\seaborn\categorical.py", line 3241, in catplot g = FacetGrid(**facet_kws) File "C:\Users\%USERNAME%\Troubleshooting\lib\site-packages\seaborn\axisgrid.py", line 403, in __init__ none_na = np.zeros(len(data), bool) TypeError: object of type 'NoneType' has no len()
已知sns.countplot可正常运行,但需要用catplot实现计数图。
报错原因
catplot是基于FacetGrid的Figure级绘图函数,它要求必须通过data参数指定数据集(DataFrame或带名称的Series),不能直接将序列传给x/y参数。
当你直接写sns.catplot(x=data, kind="count")时,catplot底层的FacetGrid会默认认为data=None,后续执行len(data)时就会触发NoneType无len()的错误。
而countplot是Axes级函数,支持直接传入序列作为x/y参数,不需要指定data,这是两者的核心差异。
解决方法
方法1:将Series转为DataFrame,指定data参数
给Series设置名称后转为DataFrame,再通过data参数传入,x使用列名:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt data = pd.Series(["NY", "NY", "CL", "TX", "CL", "FL", "NY", "FL"], name="region") df = data.to_frame() sns.catplot(x="region", kind="count", data=df) plt.show()
方法2:直接给catplot传入带名称的Series作为data
给Series设置名称后,将其作为data参数传入,x指定Series的名称:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt data = pd.Series(["NY", "NY", "CL", "TX", "CL", "FL", "NY", "FL"]) data.name = "region" # 给Series设置名称 sns.catplot(x="region", kind="count", data=data) plt.show()
两种方法都能正常生成计数图,且符合catplot的参数要求。
内容的提问来源于stack exchange,提问作者Aiden3301
相关产品推荐
相关产品推荐

