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

如何修复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的取值刚好写反了

修复步骤

  1. 导入必要的依赖库
  2. 简化数据读取逻辑,读取时直接转换价格、油耗字段为数值类型
  3. 整体对数据集排序取前20条,保证x、y、size对应同一条汽车数据
  4. 对散点大小做适当缩放,避免价格数值过大导致散点显示异常

修正后代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:03