2016-11-15 84 views
0

我正在使用Python 3.5和Matplotlib。我有不到一個月的Python經驗,但我有一個CSV文件中的數據,我需要以圖形方式表示。它只有3列:體重(磅),身高(英寸),體重指數。如果你想看到它,它是here。我只想爲4個BMI組中的每一個(BMI大於20,大於25但小於或等於30,大於20但小於或等於25)用不同的符號和顏色製作高度對重量散點圖,並且少於20)。如何使用Python和Matplotlib從CSV數據製作散點圖?

這是我到目前爲止。我覺得有一個更有效的方式來做到這一點。任何幫助/想法將不勝感激!

`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() 
` 

回答

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將包含相應的數據沒有表頭。

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') 

另一種方法是創建一個額外的列到您的數據幀,並寫代碼(1,2,3,4或「BMI1」,「bmi2」,等等。 )然後在熊貓中使用groupby()Documentation)來提取每個組。您也可以使用Seaborn,這對於可以拆分成組的數據進行這些操作非常方便。