matplotlib colorbar para dispersão

92

Estou trabalhando com dados que têm 3 parâmetros de plotagem: x, y, c. Como você cria um valor de cor personalizado para um gráfico de dispersão?

Estendendo este exemplo que estou tentando fazer:

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

mas o resultado é TypeError: You must first set_array for mappable

Adam Greenhall
fonte

Respostas:

201

Dos documentos matplotlib no scatter 1 :

cmap só é usado se c for uma matriz de flutuadores

Portanto, a lista de cores precisa ser uma lista de floats ao invés de uma lista de tuplas como você a tem agora. plt.colorbar () deseja um objeto mapeável, como o CircleCollection que plt.scatter () retorna. vmin e vmax podem então controlar os limites de sua barra de cores. Coisas fora de vmin / vmax obtêm as cores dos endpoints.

Como isso funciona para você?

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

Exemplo de imagem

mate
fonte
Eu tentei e consegui 'AxesSubplot' object has no attribute 'colorbar'. Eu fiz ax.colorbar()... o que estou fazendo de errado?
Lucas Aimaretto
Este exemplo não fornece um aplicativo claro ao usar a interface OOP matplotlib
Ryszard Cetnarski
20

Esta é a maneira OOP de adicionar uma barra de cores:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)
neurite
fonte
Quando faço isso, acabo com o gráfico completamente redimensionado de modo que todos os pontos fiquem dentro de uma fatia do gráfico na extrema direita e a barra de cores seja uma linha muito fina na parte inferior.
Marte
A resposta certa, usar diretamente pltpara traçar a barra de cores não é uma forma recomendada, eu acho. O seu caminho é recomendado.
GoingMyWay
2

Se você quer espalhar por duas variáveis ​​e colorir pela terceira, Altair pode ser uma ótima escolha.

Criação do conjunto de dados

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 de Altair

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

Enredo

insira a descrição da imagem aqui

Nipun Batra
fonte