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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:55:12