从 CSV 文件问题中使用 matplotlib 绘制散点

Plotting scatter points with matplotlib from a CSV file question

我已将网站上的一些数据提取到 CSV 文件中,我需要从该 CSV 文件在 matplotlib 中绘制散点图。我只需要 CSV 文件中的第 2 列和第 3 列数据。

我正在尝试使用 for 循环将 CSV 数据收集到列表中,然后使用它来绘制散点图,但我遇到了 "ValueError: x and y must be the same size" 错误。

import matplotlib.pyplot as plt
import csv

with open(cache_path + distance_csv) as csv_file:
reader = csv.reader(csv_file)

for column in reader:
    city_distance = [x[1] for x in csv.reader(csv_file)]
    crime_rate = [x[2] for x in csv.reader(csv_file)]

    plt.scatter(city_distance, crime_rate)
    plt.show()

我的 CSV 文件中的第 2 列和第 3 列长度相同 - 83 个单元格,但我收到 ValueError。我在这里错过了什么?

您的代码中有一些错误,我不知道是哪个错误导致了您的行为,但在您修复所有错误后您可以进步:

  1. 首先,看看您是如何阅读这些专栏的。请注意,您在 reader 中迭代了 列,但从不使用 column(您在每个迭代中创建了两个新的 csv.readers for 循环)。之后在此答案中查看可能的解决方案。
  2. 关于这一点,您阅读的 csv_file 超出了 'with' 语句的范围,因此该文件已经关闭。如果您将使用 for 循环和 column,则无论如何都不必解决此问题。
  3. 您在每次迭代中都在绘图(因此您将创建 83 个绘图,我猜您不希望这样)。

所以一个可能的解决方案是:

import matplotlib.pyplot as plt
import csv

with open(cache_path + distance_csv) as csv_file:
  reader = csv.reader(csv_file)
city_distance, crime_rate  = [], []
for column in reader:
  city_distance.append(float(column[1]))
  crime_rate.append(float(column[2]))
plt.scatter(city_distance, crime_rate)
plt.show()

为了将来,我建议您尝试验证 len(city_distance)==len(crime_rate)。 我的意思是,检查您的数据不是在 csv 中,而是在代码中,在读取值之后和错误之前 - 以获得最有用的信息来继续。