matplotlib plot - Streudiagramm und Farbzuordnung in Python



beschriftung achsenskalierung (3)

Um oben zu wflynnys Antwort hinzuzufügen, können Sie hier die verfügbaren Colormaps finden

Beispiel:

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.jet)

oder alternativ,

plt.scatter(x, y, c=t, cmap='jet')

Ich habe eine Reihe von Punkten x und y in numply Arrays gespeichert. Diese stellen x (t) und y (t) dar, wobei t = 0 ... T-1 ist

Ich zeichne ein Streudiagramm mit

import matplotlib.pyplot as plt

plt.scatter(x,y)
plt.show()

Ich hätte gerne eine Colormap, die die Zeit darstellt (daher färbt man die Punkte abhängig vom Index in den numply Arrays)

Was ist der einfachste Weg?


Hier ist ein Beispiel

import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(100)
y = np.random.rand(100)
t = np.arange(100)

plt.scatter(x, y, c=t)
plt.show()

Hier legen Sie die Farbe basierend auf dem Index t , bei dem es sich um ein Array aus [1, 2, ..., 100] .

Vielleicht ist ein leichter zu verstehendes Beispiel das etwas einfachere

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
plt.scatter(x, y, c=t)
plt.show()

Beachten Sie, dass das Array, das Sie als c , keine bestimmte Reihenfolge oder einen bestimmten Typ haben muss, dh es muss nicht wie in diesen Beispielen sortiert oder ganzzahlig sein. Die Zeichenroutine skaliert die Farbabbildung so, dass die Mindest- / Höchstwerte in c dem unteren / oberen Rand der Farbabbildung entsprechen.

Colormaps

Sie können die Farbtabelle ändern, indem Sie hinzufügen

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.cmap_name)

Das Importieren von matplotlib.cm ist optional, da Sie colormaps genauso wie cmap="cmap_name" . Es gibt eine Referenzseite mit Colormaps, die zeigt, wie jeder aussieht. Sie können auch eine Colormap umkehren, indem Sie sie einfach als cmap_name_r . Also entweder

plt.scatter(x, y, c=t, cmap=cm.cmap_name_r)
# or
plt.scatter(x, y, c=t, cmap="cmap_name_r")

wird funktionieren. Beispiele sind "jet_r" oder cm.plasma_r . Hier ist ein Beispiel mit der neuen 1.5 Colormap viridis:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')
plt.show()

Farbbalken

Sie können eine Farbleiste hinzufügen, indem Sie verwenden

plt.scatter(x, y, c=t, cmap='viridis')
plt.colorbar()
plt.show()

Beachten Sie, dass wenn Sie Zahlen und Subplots explizit verwenden (z. B. fig, ax = plt.subplots() oder ax = fig.add_subplot(111) ), das Hinzufügen eines Farbbalkens ein wenig komplizierter sein kann. Gute Beispiele finden Sie hier für eine einzelne Subplot-Farbleiste und hier für 2 Teilplots 1 Farbleiste .


Der schnellste Weg zum Zugriff auf Indexe der Liste innerhalb einer Schleife in Python 2.7 besteht darin, die Range-Methode für kleine Listen und die Aufzählungsmethode für Listen mittlerer und großer Größe zu verwenden.

In den folgenden Codebeispielen finden Sie verschiedene Ansätze, mit denen Sie über den Listen- und Zugriffsindexwert und ihre Leistungsmesswerte (die ich für Sie nützlich sein könnte) iterieren können:

from timeit import timeit

# Using range
def range_loop(iterable):
    for i in range(len(iterable)):
        1 + iterable[i]

# Using xrange
def xrange_loop(iterable):
    for i in xrange(len(iterable)):
        1 + iterable[i]

# Using enumerate
def enumerate_loop(iterable):
    for i, val in enumerate(iterable):
        1 + val

# Manual indexing
def manual_indexing_loop(iterable):
    index = 0
    for item in iterable:
        1 + item
        index += 1

Siehe Leistungskennzahlen für jede Methode unten:

from timeit import timeit

def measure(l, number=10000):
print "Measure speed for list with %d items" % len(l)
print "xrange: ", timeit(lambda :xrange_loop(l), number=number)
print "range: ", timeit(lambda :range_loop(l), number=number)
print "enumerate: ", timeit(lambda :enumerate_loop(l), number=number)
print "manual_indexing: ", timeit(lambda :manual_indexing_loop(l), number=number)

measure(range(1000))
# Measure speed for list with 1000 items
# xrange:  0.758321046829
# range:  0.701184988022
# enumerate:  0.724966049194
# manual_indexing:  0.894635915756

measure(range(10000))
# Measure speed for list with 100000 items
# xrange:  81.4756360054
# range:  75.0172479153
# enumerate:  74.687623024
# manual_indexing:  91.6308541298

measure(range(10000000), number=100)
# Measure speed for list with 10000000 items
# xrange:  82.267786026
# range:  84.0493988991
# enumerate:  78.0344707966
# manual_indexing:  95.0491430759

Als Ergebnis ist die Verwendung der range Methode die schnellste mit 1000 Artikeln. Bei einer Liste mit einer Größe von> 10 000 ist der enumerate der Gewinner.

Nachfolgend einige nützliche Links hinzufügen:





python matplotlib