Festlegen einer anderen Farbe für jede Serie im Streudiagramm auf Matplotlib

Lesezeit: 4 Minuten

Benutzer-Avatar
Yotam

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.

  • 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

Benutzer-Avatar
Rahmen Catherine White

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

3 Farben

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)

Alles geplottet

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

  • Das ist wirklich großartig für ein Streudiagramm, in dem ich tägliche Daten darüber habe, wie groß eine Textdatei ist, und wenn ich weniger als, sagen wir, 200 Bytes hinzugefügt habe, mache ich einen roten Punkt, aber ansonsten ist er grün.

    – aschultz

    14. Juli 2021 um 16:07 Uhr

  • das ist großartig, aber wie würden Sie mit dieser Funktion zum Beispiel Fehlerbalken mit der gleichen Farbe hinzufügen? @GM

    – PEBKAC

    20. Juli 2018 um 12:48 Uhr


  • Hallo @PEBKAC, danke für den Hinweis, ich habe mich heute Nachmittag bemüht, es auch in diesem Fall zum Laufen zu bringen, aber ich konnte keine Lösung finden, also habe ich die Frage bearbeitet und die anderen Benutzer gewarnt. Vielen Dank!

    – GR

    20. Juli 2018 um 15:00 Uhr

  • Hallo @GM, tut mir leid, dass ich ein paar Kommentare gepostet habe, bevor ich die Lösung fertig gestellt habe, die hier beschrieben wird: stackoverflow.com/q/51444364/7541421

    – PEBKAC

    20. Juli 2018 um 17:30 Uhr

  • Ich habe eine andere Methode verwendet, um die Farben für jede Serie in einem Streudiagramm zuzuweisen. Jetzt funktioniert es, leider kam ich mit deiner eleganten Lösung bei den Fehlerbalken nicht weiter, trotzdem bin ich dir sehr dankbar für deinen super hilfreichen Beitrag! Beifall!

    – PEBKAC

    20. Juli 2018 um 17:31 Uhr

Benutzer-Avatar
Ophir Carmi

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

Plot als Scatter, ändert aber die Farben

Benutzer-Avatar
MdM

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

Benutzer-Avatar
Stich

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

  • Ich weiß nicht, was Ihre Farbvariable ist, aber mit Ihrem Ansatz ist es möglich, Folgendes zu tun: plt.scatter(your values to the graph, color= (np.random.random_sample(), np.random.random_sample(), np.random.random_sample()) ). Sie haben einen RGB-Generator erwähnt und eine RGB-Liste deklariert, Generatoren werden zwischen ‘()’ deklariert.

    – Joël Carneiro

    14. Januar 2019 um 15:52 Uhr


1010810cookie-checkFestlegen einer anderen Farbe für jede Serie im Streudiagramm auf Matplotlib

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy