barre de couleurs matplotlib pour scatter

89

Je travaille avec des données dont les données ont 3 paramètres de traçage: x, y, c. Comment créer une valeur de couleur personnalisée pour un nuage de points?

Prolonger cet exemple que j'essaye de faire:

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

mais le résultat est TypeError: You must first set_array for mappable

Adam Greenhall
la source

Réponses:

196

À partir de la documentation matplotlib sur le scatter 1 :

cmap n'est utilisé que si c est un tableau de flottants

La liste de couleurs doit donc être une liste de flottants plutôt qu'une liste de tuples comme vous l'avez maintenant. plt.colorbar () veut un objet mappable, comme le CircleCollection que plt.scatter () renvoie. vmin et vmax peuvent alors contrôler les limites de votre barre de couleurs. Les choses en dehors de vmin / vmax obtiennent les couleurs des points de terminaison.

Comment cela fonctionne-t-il pour vous?

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

Exemple d'image

mat
la source
Je l'ai essayé et j'ai obtenu 'AxesSubplot' object has no attribute 'colorbar'. J'ai fait ax.colorbar()... qu'est-ce que je fais de mal?
Lucas Aimaretto
Cet exemple ne fournit pas une application claire lors de l'utilisation de l'interface POO matplotlib
Ryszard Cetnarski
18

Voici la façon OOP d'ajouter une barre de couleurs:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)
neurite
la source
Lorsque je fais cela, je me retrouve avec l'intrigue complètement redimensionnée de sorte que tous les points soient dans un ruban de l'intrigue à l'extrême droite, et la barre de couleurs est une ligne très fine en bas.
Marses le
La bonne réponse, en utilisant directement pltpour tracer la barre de couleurs n'est pas une méthode recommandée, je pense. Le vôtre est une manière recommandée.
GoingMyWay
2

Si vous cherchez à disperser par deux variables et la couleur par la troisième, Altair peut être un excellent choix.

Création du jeu de données

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

Parcelle Altair

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

Terrain

entrez la description de l'image ici

Nipun Batra
la source