Wykres punktowy i mapowanie kolorów w Pythonie

91

Mam zakres punktów xiy przechowywanych w tablicach numpy. Reprezentują one x (t) i y (t), gdzie t = 0 ... T-1

Planuję wykres punktowy za pomocą

import matplotlib.pyplot as plt

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

Chciałbym mieć mapę kolorów reprezentującą czas (dlatego kolorowanie punktów w zależności od indeksu w tablicach numpy)

Jaki jest najłatwiejszy sposób?

Vincent
źródło

Odpowiedzi:

170

Oto przykład

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

Tutaj ustawiasz kolor na podstawie indeksu t, który jest po prostu tablicą [1, 2, ..., 100]. wprowadź opis obrazu tutaj

Być może łatwiejszy do zrozumienia przykład jest nieco prostszy

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

wprowadź opis obrazu tutaj

Zwróć uwagę, że tablica, którą przekazujesz jako c, nie musi mieć określonej kolejności ani typu, tj. Nie musi być sortowana ani liczbami całkowitymi, jak w tych przykładach. Procedura kreślenia przeskaluje mapę kolorów w taki sposób, aby minimalne / maksymalne wartości codpowiadały dolnej / górnej części mapy kolorów.

Colormaps

Możesz zmienić mapę kolorów, dodając

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

Importowanie matplotlib.cmjest opcjonalne, podobnie jak colormaps cmap="cmap_name". Istnieje strona odniesienia z mapami kolorów pokazująca, jak każdy z nich wygląda. Wiedz również, że możesz odwrócić mapę kolorów, po prostu nazywając ją jako cmap_name_r. Więc też

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

będzie działać. Przykładami są "jet_r"lub cm.plasma_r. Oto przykład z nową 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()

wprowadź opis obrazu tutaj

Paski kolorów

Możesz dodać pasek kolorów za pomocą

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

wprowadź opis obrazu tutaj

Zwróć uwagę, że jeśli jawnie używasz rysunków i wykresów pomocniczych (np. fig, ax = plt.subplots()Lub ax = fig.add_subplot(111)), dodanie paska kolorów może być nieco bardziej skomplikowane. Dobre przykłady można znaleźć tutaj dla pojedynczego paska koloru podrzędnego, a tutaj dla 2 wykresów podrzędnych 1 paska koloru .

wflynny
źródło
1
Możesz uzyskać legendę dla kolorów za pomocą plt.colorbar()polecenia.
drevicko
Wygląda na to, że kod tutaj się zmienił. Cmap = cm.colormap_name powinno teraz mieć wartość cmap = cm.cmapname.
Chris
@ cmarti1138 Nie jestem pewien, co masz na myśli, cm.colormap_namea cm.cmapnamenie rzeczywiste zmienne w matplotlib.cm; to tylko pseudokod dla cm.jetlub cm.veridis_r, itp.
wflynny
Czy istnieje sposób na zmianę listy cmaplub clisty już wykreślonej krzywej?
Guimoute
10

Aby dodać do powyższej odpowiedzi wflynny, możesz znaleźć dostępne mapy kolorów tutaj

Przykład:

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

lub alternatywnie,

plt.scatter(x, y, c=t, cmap='jet')
Nathan
źródło
3

Pasek kolorów podplotu

W przypadku wykresów podrzędnych z rozproszeniem możesz oszukać pasek kolorów na swoich osiach, budując element „dający się odwzorować” za pomocą dodatkowej figury, a następnie dodając go do pierwotnego wykresu.

Jako kontynuacja powyższego przykładu:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
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')


# Build your secondary mirror axes:
fig2, (ax3, ax4) = plt.subplots(1, 2)

# Build maps that parallel the color-coded data
# NOTE 1: imshow requires a 2-D array as input
# NOTE 2: You must use the same cmap tag as above for it match
map1 = ax3.imshow(np.stack([t, t]),cmap='viridis')
map2 = ax4.imshow(np.stack([t, t]),cmap='viridis_r')

# Add your maps onto your original figure/axes
fig.colorbar(map1, ax=ax1)
fig.colorbar(map2, ax=ax2)
plt.show()

Rozrzuć podploty za pomocą COLORBAR

Zwróć uwagę, że wyprowadzisz również dodatkową liczbę, którą możesz zignorować.

Audelia
źródło