Matplotlib scatterplot; kolor jako funkcja trzeciej zmiennej

152

Chcę utworzyć wykres rozrzutu (za pomocą matplotlib), w którym punkty są cieniowane zgodnie z trzecią zmienną. Jestem z tym bardzo blisko:

plt.scatter(w, M, c=p, marker='s')

gdzie wi M są punktami danych, a p jest zmienną, w odniesieniu do której chcę zacienić.
Jednak chcę to zrobić w odcieniach szarości, a nie w kolorze. Czy ktoś może pomóc?

Thomas Collett
źródło

Odpowiedzi:

156

Nie ma potrzeby ręcznego ustawiania kolorów. Zamiast tego określ mapę kolorów w skali szarości ...

import numpy as np
import matplotlib.pyplot as plt

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

# Plot...
plt.scatter(x, y, c=y, s=500)
plt.gray()

plt.show()

wprowadź opis obrazu tutaj

Lub, jeśli wolisz szerszy zakrescmap map kolorów , możesz również określić kwarg na scatter. Aby użyć odwróconej wersji któregokolwiek z nich, po prostu określ " _r" wersję dowolnego z nich. Np. gray_rZamiast gray. Istnieje kilka różnych colormaps skali szarości gotowych (na przykład gray, gist_yarg, binaryitp).

import matplotlib.pyplot as plt
import numpy as np

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

plt.scatter(x, y, c=y, s=500, cmap='gray')
plt.show()
Joe Kington
źródło
1
Dzięki! Czy w ogóle istnieje możliwość rysowania konturów wokół tych punktów zawierających określoną ilość masy całkowitej?
Thomas Collett
6
mpl.cmjest również dostępny bezpośrednio jako plt.cm.
heltonbiker
@Thomas Collet: Jeśli chcesz narysować kontury, musiałbyś interpolować dane z punktów do macierzy 2D, a następnie wykreślić to za pomocą plt.contour()lub plt.contourf()- ale to inne pytanie
Zak
Jak dodać etykietę do legendy? W tym przypadku z liczbami ciągłymi podejrzewam, że użyjesz paska kolorów. A co w przypadku wartości dyskretnych? np. czy mógłbym dodać 3 etykiety w legendzie dla moich trzech kategorii?
Nate
26

W matplotlib szare kolory można podać jako ciąg o wartości liczbowej z zakresu od 0 do 1.
Na przykładc = '0.1'

Następnie możesz przekonwertować trzecią zmienną na wartość z tego zakresu i użyć jej do pokolorowania punktów.
W poniższym przykładzie użyłem pozycji y punktu jako wartości określającej kolor:

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [125, 32, 54, 253, 67, 87, 233, 56, 67]

color = [str(item/255.) for item in y]

plt.scatter(x, y, s=500, c=color)

plt.show()

wprowadź opis obrazu tutaj

joaquin
źródło
3
Dla rekordu możesz zastosować ALFA jako mapę kolorów, jeśli jako cargument podasz tablicę w kształcie (n, 4) , z wartościami alfa w czwartej kolumnie. Jeśli trzecia zmienna to Z, shape=(n,1)to colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max()))daje bardzo fajny efekt (oczywiście można ją podkręcić).
heltonbiker
Pojawia
1
@MattClimbs Podejrzewam, że dzwonisz do plt.plot zamiast plt.scatter, jak w przykładzie.
smashbro
jak dodać pasek kolorów do tego wykresu?
FaCoffee
2
@FaCoffee plt.colorbar()to zrobi
Mathew Savage
10

Czasami może zajść potrzeba precyzyjnego wykreślenia koloru na podstawie przypadku wartości x . Na przykład możesz mieć ramkę danych z 3 typami zmiennych i niektórymi punktami danych. I chcesz śledzić,

  • Wykreśl punkty odpowiadające zmiennej fizycznej „A” zaznaczonej na czerwono.
  • Wykreśl punkty odpowiadające zmiennej fizycznej „B” na NIEBIESKO.
  • Wykreśl punkty odpowiadające zmiennej fizycznej „C” na ZIELONO.

W takim przypadku może być konieczne napisanie do funkcji short, aby zmapować wartości x do odpowiednich nazw kolorów jako listę, a następnie przekazać tę listę do plt.scatterpolecenia.

x=['A','B','B','C','A','B']
y=[15,30,25,18,22,13]

# Function to map the colors as a list from the input list of x variables
def pltcolor(lst):
    cols=[]
    for l in lst:
        if l=='A':
            cols.append('red')
        elif l=='B':
            cols.append('blue')
        else:
            cols.append('green')
    return cols
# Create the colors list using the function above
cols=pltcolor(x)

plt.scatter(x=x,y=y,s=500,c=cols) #Pass on the list created by the function here
plt.grid(True)
plt.show()

Kolorowanie wykresu punktowego w funkcji zmiennej x

Tirtha
źródło
jak stworzyć pasek kolorów dla tej działki?
Maryam Rahmani Moghaddam