matplotlib colorbar per scatter


92

Sto lavorando con dati che hanno i dati che hanno 3 parametri di tracciamento: x, y, c. Come si crea un valore di colore personalizzato per un grafico a dispersione?

Estendendo questo esempio che sto cercando di fare:

import matplotlib
import matplotlib.pyplot as plt
cm = matplotlib.cm.get_cmap('RdYlBu')
colors=[cm(1.*i/20) for i in range(20)]
xy = range(20)
plt.subplot(111)
colorlist=[colors[x/2] for x in xy] #actually some other non-linear relationship
plt.scatter(xy, xy, c=colorlist, s=35, vmin=0, vmax=20)
plt.colorbar()
plt.show()

ma il risultato è TypeError: You must first set_array for mappable

Risposte:


201

Dai documenti matplotlib a dispersione 1 :

cmap viene utilizzato solo se c è un array di float

Quindi colorlist deve essere un elenco di float piuttosto che un elenco di tuple come lo hai ora. plt.colorbar () vuole un oggetto mappabile, come CircleCollection restituito da plt.scatter (). vmin e vmax possono quindi controllare i limiti della barra dei colori. Le cose al di fuori di vmin / vmax ottengono i colori degli endpoint.

Come funziona per te?

import matplotlib.pyplot as plt
cm = plt.cm.get_cmap('RdYlBu')
xy = range(20)
z = xy
sc = plt.scatter(xy, xy, c=z, vmin=0, vmax=20, s=35, cmap=cm)
plt.colorbar(sc)
plt.show()

Esempio di immagine


L'ho provato e ho ottenuto 'AxesSubplot' object has no attribute 'colorbar'. Ho fatto ax.colorbar()... cosa sto facendo di sbagliato?
Lucas Aimaretto

Questo esempio non fornisce un'applicazione chiara quando si utilizza l'interfaccia OOP matplotlib
Ryszard Cetnarski

20

Ecco il modo OOP per aggiungere una barra dei colori:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)

Quando lo faccio, finisco con il riscalare completamente la trama in modo che tutti i punti siano all'interno di una scheggia della trama all'estrema destra e la barra dei colori è una linea molto sottile nella parte inferiore.
Marte

La risposta giusta, usare direttamente pltper tracciare la barra dei colori non è un modo consigliato credo. Il tuo è un modo lodato.
GoingMyWay

2

Se stai cercando di disperdere per due variabili e colorare per la terza, Altair può essere un'ottima scelta.

Creazione del set di dati

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.DataFrame(40*np.random.randn(10, 3), columns=['A', 'B','C'])

Trama di Altair

from altair import *
Chart(df).mark_circle().encode(x='A',y='B', color='C').configure_cell(width=200, height=150)

Tracciare

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.