调用字典中pandas DataFrame序列绘制散点图时触发AttributeError
问题根源:
ax 参数传错了类型 你遇到的 AttributeError: 'int' object has no attribute 'scatter' 根本原因不是你的Series类型有问题,而是你给 sns.scatterplot() 的 ax 参数传了整数 0 —— seaborn的这个参数需要接收的是matplotlib的Axes对象,而不是普通整数,所以Python把0当成了int类型,自然找不到scatter方法。
方案1:不指定ax,让seaborn自动创建绘图区域
如果不需要自定义子图布局,直接去掉ax=0参数就行,代码修改后如下:
import pandas as pd import seaborn as sns df1 = pd.DataFrame([[1,2], [3,4]], columns = ['A', 'B']) df_dict = {'df1': df1} # 变量名改了下,避免和pandas的DataFrame重名,更清晰 for i in df_dict.values(): sns.scatterplot(x=i['A'], y=i['B'])
运行这段代码就能正常生成散点图了。
方案2:手动创建Axes对象再传入ax参数
如果需要指定绘图的Axes(比如在子图中绘制),可以先通过matplotlib创建Axes对象,再传给ax:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df1 = pd.DataFrame([[1,2], [3,4]], columns = ['A', 'B']) df_dict = {'df1': df1} # 创建一个Axes对象 fig, ax = plt.subplots() for i in df_dict.values(): sns.scatterplot(x=i['A'], y=i['B'], ax=ax) plt.show()
这样也能正确生成散点图,而且你可以通过fig和ax进一步自定义图表的样式、标题等。
另外补充一点:你原来的变量名df和pandas的DataFrame类名太像了,建议改成df_dict这种更清晰的名字,避免潜在的命名冲突。
内容的提问来源于stack exchange,提问作者Rico
相关产品推荐
相关产品推荐

