如何使用Python和Matplotlib从CSV数据制作散点图?

时间:2016-11-15 03:52:49

标签: matplotlib python-3.5 scatter-plot

我使用的是Python 3.5和Matplotlib。我有不到一个月的python经验,但我有一个CSV文件中的数据,我需要以图形方式表示。它只有3列:重量(磅),身高(英寸),BMI。如果你想看到它,那就是here。我只是想为4个BMI组中的每一个制作具有不同符号和颜色的高度与重量散点图(BMI大于20,大于25但小于或等于30,大于20但小于或等于25 ,不到20)。

这是我到目前为止所拥有的。我觉得有一种更有效的方法。任何帮助/想法将不胜感激!

 `import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

data2 = pd.read_csv('BMIData.csv')

bmi1 = data2[(data2.BMI<20)]
bmi2 = data2[(data2.BMI>20) & (data2.BMI<=25)]
bmi3 = data2[(data2.BMI>25) & (data2.BMI<=30)]
bmi4 = data2[(data2.BMI>30)]

bmi1h = bmi1.height.values
bmi1w = bmi1.weight.values

bmi2h = bmi2.height.values
bmi2w = bmi2.weight.values

bmi3h = bmi3.height.values
bmi3w = bmi3.weight.values

bmi4h = bmi4.height.values
bmi4w = bmi4.weight.values

plt.scatter(bmi1h, bmi1w, color='r', marker='*', label='Less than 20')
plt.scatter(bmi2h, bmi2w, color='b', marker='^', label='20 to 25')
plt.scatter(bmi3h, bmi3w, color='c', marker='x', label='25 to 30')
plt.scatter(bmi4h, bmi4w, color='m', label='Greater than 30')

plt.xlabel('Height (in)')
plt.ylabel('Weight (lb)')
plt.title('BMI Data')
plt.legend()

plt.axis([63,80,100,400])


plt.savefig('BMIplot.png', dpi=300)

plt.show()
`

2 个答案:

答案 0 :(得分:0)

您可以按如下方式阅读CSV文件:

import numpy as np
import matplotlib.pyplot as plt

file = open('BMIdata.csv','r')
readings = file.readlines()
readings.pop(0)
height = []
weight = []
BMI = []
for reading in readings:
    h, w,B = reading.strip('\r\n').split(',')
    height.append(h)
    weight.append(w)
    BMI.append(B)

列表:身高,体重,BMI将包含没有表格标题的相应数据。

答案 1 :(得分:0)

有很多方法可以做到这一点。我经常使用的一种方法是构造布尔索引器数组,而不是DataFrame的副本。请参阅Indexing and Selecting Data上的文档。然后,您的代码将简化为:

data2 = pd.read_csv('BMIData.csv')

bmi1 = (data2.BMI<20)
bmi2 = (data2.BMI>20) & (data2.BMI<=25)
bmi3 = (data2.BMI>25) & (data2.BMI<=30)
bmi4 = (data2.BMI>30)

plt.scatter(data2.loc[bmi1,'height'], data2.loc[bmi1,'weight'], color='r', marker='*', label='Less than 20')
plt.scatter(data2.loc[bmi2,'height'], data2.loc[bmi2,'weight'], color='b', marker='^', label='20 to 25')
plt.scatter(data2.loc[bmi3,'height'], data2.loc[bmi3,'weight'], color='c', marker='x', label='25 to 30')
plt.scatter(data2.loc[bmi4,'height'], data2.loc[bmi4,'weight'], color='m', label='Greater than 30')

另一种方法是为您的DataFrame创建一个额外的列,并编写代码(1,2,3,4或'bmi1','bmi2'等),然后在pandas中使用groupby()Documentation)提取每个组。您还可以使用Seaborn,这对于可以拆分成组的数据进行这类操作非常方便。