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.
(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.)
Sie sollten diesen Kommentar in Ihre Frage schreiben und ihn bearbeiten, anstatt ihn als Kommentar zu veröffentlichen. –
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') '. –