2017-05-29 1 views
1

Ich versuche, verschiedene Dinge in Streudiagrammen zu plotten, indem ich mehrere Unterplots habe und über die übrigen Kategorien iteriere, aber die Plots zeigen nur die erste Iteration ohne einen Fehler zu werfen. Um zu klären, hier ist ein Beispiel dafür, was die Daten tatsächlich aussehen:Streudiagramm in einer Schleife zeichnet nur die erste Iteration

  a kind state property T 
0 0.905618 I dry prop1 10 
1 0.050311 I wet prop1 20 
2 0.933696 II dry prop1 30 
3 0.114824 III wet prop1 40 
4 0.942719 IV dry prop1 50 
5 0.276627 II wet prop2 10 
6 0.612303 III dry prop2 20 
7 0.803451 IV wet prop2 30 
8 0.257816 II dry prop2 40 
9 0.122468 IV wet prop2 50 

Und das ist, wie ich das Beispiel generierte:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import gridspec 

kinds = ['I','II','III','IV'] 
states = ['dry','wet'] 
props = ['prop1','prop2'] 
T = [10,20,30,40,50] 
a = np.random.rand(10) 
k = ['I','I','II','III','IV','II','III','IV','II','IV'] 
s = ['dry','wet','dry','wet','dry','wet','dry','wet','dry','wet'] 
p = ['prop1','prop1','prop1','prop1','prop1','prop2','prop2','prop2','prop2','prop2'] 
t = [10,20,30,40,50,10,20,30,40,50] 
df = pd.DataFrame(index=range(10),columns=['a','kind','state','property','T']) 
df['a']=a 
df['kind']=k 
df['state']=s 
df['property']=p 
df['T']=t 
print df 

Als nächstes werde ich 2 Zeilen und 2 Spalten erzeugen, von Teilplots, um Variabilitäten in Eigenschaft1 und Eigenschaft2 in nassen und trockenen Zuständen anzuzeigen. So schneiden ich im Grunde meine Datenrahmen in mehrere kleinere wie folgt aus:

first = df[(df['state']=='dry')&(df['property']=='prop1')] 
second = df[(df['state']=='wet')&(df['property']=='prop1')] 
third = df[(df['state']=='dry')&(df['property']=='prop2')] 
fourth = df[(df['state']=='wet')&(df['property']=='prop2')] 
dfs = [first,second,third,fourth] 

in jedem dieser Nebenhandlungen, die bestimmte Laborbedingungen angeben, ich die Werte von a gegen T für verschiedene Arten von Proben darstellen möchten. Um zwischen den Arten von Samples zu unterscheiden, weise ich ihnen verschiedene Farben und Marker zu. So, hier ist mein Plotten Skript:

fig = plt.figure(figsize=(8,8.5)) 
gs = gridspec.GridSpec(2,2, hspace=0.4, wspace=0.3) 
colours = ['r','b','g','gold'] 
symbols = ['v','v','^','^'] 
titles=['dry 1','wet 1','dry 2','wet 2'] 
for no, df in enumerate(dfs): 
    ax = fig.add_subplot(gs[no]) 
    for i, r in enumerate(kinds): 
     #print i, r 
     df = df[df['kind']==r] 
     c = colours[i] 
     m = symbols[i] 
     plt.scatter(df['T'],df['a'],c=c,s=50.0, marker=m, edgecolor='k') 

    ax = plt.xlabel('T') 
    ax = plt.xticks(T) 
    ax = plt.ylabel('A') 
    ax = plt.title(titles[no],fontsize=12,alpha=0.75) 
plt.show() 

Aber das Ergebnis zeichnet nur die erste Iteration, in diesem Fall Art I in einem roten Dreieck. Wenn ich dieses erste Element aus den Iterationslisten entferne, zeichnet es nur die erste Variable (Art II in blauen Dreiecken).

Was mache ich falsch? Die Figur sieht so aus, aber ich hätte gerne jede Unterplot entsprechend mit roten und blauen und grünen und goldenen Markierungen bestückt. Just the red

(Bitte beachten Sie dies auch mit meinen realen Daten geschieht, so dass das Problem nicht in der Art und Weise soll ich das Beispiel erzeugen.)

+0

Sie sollten diesen Kommentar in Ihre Frage schreiben und ihn bearbeiten, anstatt ihn als Kommentar zu veröffentlichen. –

+1

Ich denke, dein Problem ist in dieser Zeile: 'df = df [df ['kind'] == r]'. Es befindet sich innerhalb der inneren 'for'-Schleife, was bedeutet, dass Ihr ursprüngliches' df' der äußeren 'for'-Schleife überschrieben wird. Versuchen Sie es in z. 'df2 = df [df ['Art'] == r]' und 'plt.scatter (df2 ['T'], df2 ['a'], c = c, s = 50.0, Markierung = m, edgecolor = 'k') '. –

Antwort

4

Ihr Problem liegt in der inneren for Schleife. Indem Sie df = df[df['kind']==r] schreiben, ersetzen Sie das ursprüngliche df durch die Version, die für I gefiltert wird. In der nächsten Iteration der Schleife, in der Sie nach II filtern würden, werden keine weiteren Daten gefunden. Daher erhalten Sie auch keine Fehlermeldung, da der Code ansonsten "korrekt" ist. Wenn Sie das entsprechende Stück Code wie folgt umschreiben:

for no, df in enumerate(dfs): 
    ax = fig.add_subplot(gs[no]) 
    for i, r in enumerate(kinds): 
     #print i, r 
     df2 = df[df['kind']==r] 
     c = colours[i] 
     m = symbols[i] 
     plt.scatter(df2['T'],df2['a'],c=c,s=50.0, marker=m, edgecolor='k') 

    ax = plt.xlabel('T') 
    ax = plt.xticks(T) 
    ax = plt.ylabel('A') 
    ax = plt.title(titles[no],fontsize=12,alpha=0.75) 

Es sollte gut funktionieren. Getestet an Python 3.5.

Verwandte Themen