2016-11-15 2 views
0

Ich benutze Python 3.5 und Matplotlib. Ich habe weniger als einen Monat Erfahrung mit Python, aber ich habe Daten in einer CSV-Datei, die ich grafisch darstellen muss. Es hat nur 3 Spalten: Gewicht (Pfund), Höhe (Zoll), BMI. Es ist here, wenn Sie es sehen wollen. Ich möchte nur ein Höhen-Gewicht-Streudiagramm mit verschiedenen Symbolen und Farben für jede der 4 BMI-Gruppen erstellen (BMI größer als 20, größer als 25, aber kleiner oder gleich 30, größer als 20, aber kleiner oder gleich 25 und weniger als 20).Wie mache ich ein Streudiagramm aus CSV-Daten mit Python und Matplotlib?

Hier ist was ich bisher habe. Ich habe das Gefühl, dass es einen effizienteren Weg gibt, dies zu tun. Jede Hilfe/Ideen würde sehr geschätzt werden!

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) 

Die Listen:

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

Antwort

0

Sie können Ihre CSV-Datei wie folgt lesen Größe, Gewicht, BMI, die jeweiligen Daten ohne die Tabellenüberschrift enthält.

0

Es gibt viele Möglichkeiten, dies zu tun. Eine Möglichkeit, die ich häufig verwende, besteht darin, boolesche Indexer-Arrays anstelle von Kopien des DataFrames zu konstruieren. Siehe die Dokumentation unter Indexing and Selecting Data. Der Code wird dann vereinfacht:

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

Eine andere Möglichkeit wäre eine zusätzliche Spalte zu Ihrem Datenrahmen zu erstellen, und schreiben Sie einen Code (1,2,3,4 oder ‚Bmi1‘, ‚BMI2‘ usw.) Dann verwenden Sie groupby() in Pandas (Documentation), um jede der Gruppen zu extrahieren. Sie könnten auch Seaborn verwenden, was sehr praktisch ist, um diese Art von Operationen an Daten durchzuführen, die in Gruppen aufgeteilt werden können.

Verwandte Themen