Angenommen, ich habe drei Datensätze:
X = [1,2,3,4]
Y1 = [4,8,12,16]
Y2 = [1,4,9,16]
Ich kann das streuen:
from matplotlib import pyplot as plt
plt.scatter(X,Y1,color="red")
plt.scatter(X,Y2,color="blue")
plt.show()
Wie kann ich das mit 10 Sätzen machen?
Ich habe danach gesucht und konnte jeden Hinweis auf das finden, was ich frage.
Bearbeiten: Klärung (hoffentlich) meiner Frage
Wenn ich Scatter mehrmals aufrufe, kann ich nur die gleiche Farbe für jeden Scatter festlegen. Ich weiß auch, dass ich ein Farbarray manuell einstellen kann, aber ich bin sicher, dass es einen besseren Weg gibt, dies zu tun. Meine Frage ist dann: “Wie kann ich meine mehreren Datensätze automatisch mit einer anderen Farbe streuen.
Wenn das hilft, kann ich jedem Datensatz einfach eine eindeutige Nummer zuweisen.
Der normale Weg, Plots mit Punkten in verschiedenen Farben in Matplotlib zu zeichnen, besteht darin, eine Liste von Farben als Parameter zu übergeben.
Z.B:
import matplotlib.pyplot
matplotlib.pyplot.scatter([1,2,3],[4,5,6],color=['red','green','blue'])

Wenn Sie eine Liste mit Listen haben und diese pro Liste farbig darstellen möchten. Ich denke, der eleganteste Weg ist der von @DSM vorgeschlagene, machen Sie einfach eine Schleife, die mehrere Aufrufe zum Scatter macht.
Aber wenn Sie es aus irgendeinem Grund mit nur einem Anruf machen wollten, können Sie eine große Liste von Farben erstellen, mit einem Listenverständnis und ein bisschen Bodenteilung:
import matplotlib
import numpy as np
X = [1,2,3,4]
Ys = np.array([[4,8,12,16],
[1,4,9,16],
[17, 10, 13, 18],
[9, 10, 18, 11],
[4, 15, 17, 6],
[7, 10, 8, 7],
[9, 0, 10, 11],
[14, 1, 15, 5],
[8, 15, 9, 14],
[20, 7, 1, 5]])
nCols = len(X)
nRows = Ys.shape[0]
colors = matplotlib.cm.rainbow(np.linspace(0, 1, len(Ys)))
cs = [colors[i//len(X)] for i in range(len(Ys)*len(X))] #could be done with numpy's repmat
Xs=X*nRows #use list multiplication for repetition
matplotlib.pyplot.scatter(Xs,Ys.flatten(),color=cs)

cs = [array([ 0.5, 0. , 1. , 1. ]),
array([ 0.5, 0. , 1. , 1. ]),
array([ 0.5, 0. , 1. , 1. ]),
array([ 0.5, 0. , 1. , 1. ]),
array([ 0.28039216, 0.33815827, 0.98516223, 1. ]),
array([ 0.28039216, 0.33815827, 0.98516223, 1. ]),
array([ 0.28039216, 0.33815827, 0.98516223, 1. ]),
array([ 0.28039216, 0.33815827, 0.98516223, 1. ]),
...
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17,
1.00000000e+00]),
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17,
1.00000000e+00]),
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17,
1.00000000e+00]),
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17,
1.00000000e+00])]
Sie können immer die verwenden plot()
funktionieren so:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
ys = [i+x+(i*x)**2 for i in range(10)]
plt.figure()
for y in ys:
plt.plot(x, y, 'o')
plt.show()

Eine VIEL schnellere Lösung für große Datensätze und eine begrenzte Anzahl von Farben ist die Verwendung von Pandas und der Groupby-Funktion:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time
# a generic set of data with associated colors
nsamples=1000
x=np.random.uniform(0,10,nsamples)
y=np.random.uniform(0,10,nsamples)
colors={0:'r',1:'g',2:'b',3:'k'}
c=[colors[i] for i in np.round(np.random.uniform(0,3,nsamples),0)]
plt.close('all')
# "Fast" Scatter plotting
starttime=time.time()
# 1) make a dataframe
df=pd.DataFrame()
df['x']=x
df['y']=y
df['c']=c
plt.figure()
# 2) group the dataframe by color and loop
for g,b in df.groupby(by='c'):
plt.scatter(b['x'],b['y'],color=g)
print('Fast execution time:', time.time()-starttime)
# "Slow" Scatter plotting
starttime=time.time()
plt.figure()
# 2) group the dataframe by color and loop
for i in range(len(x)):
plt.scatter(x[i],y[i],color=c[i])
print('Slow execution time:', time.time()-starttime)
plt.show()
Das funktioniert bei mir:
Verwenden Sie für jede Serie einen zufälligen RGB-Farbgenerator
c = color[np.random.random_sample(), np.random.random_sample(), np.random.random_sample()]
Was ist hier die Frage? Farbe kann auch ein Array sein, aber was können Sie nicht lösen, indem Sie scatter einfach mehrmals aufrufen?
– seberg
2. September 2012 um 14:22 Uhr
Wenn ich Scatter mehrmals anrufe, erhalte ich die gleichen Farben. Ich werde meine Frage aktualisieren.
– Yotam
2. September 2012 um 14:24 Uhr