如何修复Python使用matplotlib绘制散点图设置大小时出现的ValueError
错误原因与修复方案
核心错误点
- 数据类型错误:通过
csv.reader读取的所有字段默认是字符串类型,价格、油耗类字段未转换为数值类型,无法直接作为散点大小、坐标参数传入绘图函数 - 维度不匹配:你单独对
retail price和city mpg排序后取前20条,得到的x、y不属于同一行的汽车数据,且长度仅为20,但size参数传入的是全量数据集的dealer price,三者长度不一致触发ValueError - 导入缺失:代码开头未导入
pandas、matplotlib.pyplot依赖库 - 文件操作冗余:已经使用
with上下文管理器管理文件句柄,无需额外手动关闭文件 - 坐标逻辑错误:你的需求是x轴为城市油耗、y轴为零售价格,原代码里x和y的取值刚好写反了
修复步骤
- 导入必要的依赖库
- 简化数据读取逻辑,读取时直接转换价格、油耗字段为数值类型
- 整体对数据集排序取前20条,保证x、y、size对应同一条汽车数据
- 对散点大小做适当缩放,避免价格数值过大导致散点显示异常
修正后代码
import pandas as pd import matplotlib.pyplot as plt import csv # 读取数据并转换数值类型 car_data = [] with open("data_cars_2004 (1).csv", "r") as f: reader = csv.reader(f) next(reader) for row in reader: # 转换价格、油耗为float类型 car_data.append([ row[0], float(row[9]), float(row[10]), float(row[14]) ]) df = pd.DataFrame(car_data) df.rename(columns={0: 'name', 1:'retail price', 2:'dealer price', 3: 'city mpg'}, inplace = True) # 按零售价格排序后整体取前20条,保证所有字段对应同一辆车 top20_df = df.sort_values(by='retail price').head(20) x = top20_df['city mpg'] y = top20_df['retail price'] # 经销商报价除以1000缩放,避免散点过大超出画布 size = top20_df['dealer price'] / 1000 plt.scatter(x, y, s=size) plt.xlabel('城市油耗(City MPG)') plt.ylabel('汽车零售价格(retail price)') plt.show()
内容的提问来源于stack exchange,提问作者Adam Shah
相关产品推荐
相关产品推荐

