如何使用Pandas或Numpy绘制含字符串列与数值列的图表?
解决DataFrame字符串列与数值列的绘图问题
嘿,我来帮你搞定这个问题!你遇到报错的核心原因是:pandas.DataFrame.plot() 默认期望处理数值型数据,而你的 StateName 是字符串格式的分类变量,没法直接映射成坐标轴的数值,所以直接调用会报错。下面给你几种实用的解决方案,根据你的需求来选就行:
1. 绘制「每个州对应平均温度」的条形图
如果想直观展示每个州的平均温度数值,条形图是最直接的选择:
import pandas as pd import matplotlib.pyplot as plt # 先读取你的分号分隔数据(替换成你的数据路径或来源) df = pd.read_csv('your_data_file.csv', sep=';') # 绘制条形图,指定x为分类列StateName,y为数值列AvgTemp df.plot(x='StateName', y='AvgTemp', kind='bar', figsize=(10, 6)) plt.title('Average Temperature by State') plt.xlabel('State Name') plt.ylabel('Average Temperature') plt.xticks(rotation=45) # 旋转x轴标签,避免长州名重叠 plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
2. 绘制「各州平均温度分布」的箱线图
如果想查看不同州的温度分布范围(比如中位数、极值),箱线图很合适:
# 箱线图:按StateName分组展示AvgTemp的分布 df.boxplot(column='AvgTemp', by='StateName', figsize=(10, 6)) plt.title('Average Temperature Distribution by State') plt.suptitle('') # 去掉pandas默认的顶部标题,避免重复 plt.xlabel('State Name') plt.ylabel('Average Temperature') plt.xticks(rotation=45) plt.tight_layout() plt.show()
3. 绘制「带州区分的散点图」
如果想用散点图展示数据,需要先把字符串类型的StateName编码成数值,用来区分不同州的颜色:
import numpy as np # 给每个州分配唯一的数值编码(factorize会返回编码后的数组和唯一值列表) state_codes, state_names = pd.factorize(df['StateName']) # 绘制散点图,用编码后的数值做x轴,颜色区分州 plt.scatter(state_codes, df['AvgTemp'], c=state_codes, cmap='viridis') plt.title('Average Temperature by State') plt.xlabel('State Name') # 把x轴刻度替换回对应的州名 plt.xticks(ticks=np.unique(state_codes), labels=state_names, rotation=45) plt.ylabel('Average Temperature') # 添加颜色条,标注每个颜色对应的州 plt.colorbar(ticks=np.unique(state_codes), label='State Name') plt.tight_layout() plt.show()
核心思路总结:字符串列属于分类变量,不能直接当作数值轴使用,要么把它作为x轴的分类标签(如条形图、箱线图),要么将其编码为数值用于分组/颜色区分(如散点图)。
内容的提问来源于stack exchange,提问作者MrMustafa
相关产品推荐
相关产品推荐

