Gráfico de dispersão e mapeamento de cores em Python

92

Eu tenho um intervalo de pontos xey armazenados em matrizes numpy. Aqueles representam x (t) e y (t) onde t = 0 ... T-1

Estou traçando um gráfico de dispersão usando

import matplotlib.pyplot as plt

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

Eu gostaria de ter um mapa de cores representando o tempo (portanto, colorindo os pontos dependendo do índice nas matrizes numpy)

Qual é a maneira mais fácil de fazer isso?

Vincent
fonte

Respostas:

175

Aqui está um exemplo

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

Aqui você está definindo a cor com base no índice,, tque é apenas uma matriz de [1, 2, ..., 100]. insira a descrição da imagem aqui

Talvez um exemplo mais fácil de entender seja o ligeiramente mais simples

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

insira a descrição da imagem aqui

Observe que o array que você passou cnão precisa ter nenhuma ordem ou tipo específico, ou seja, não precisa ser classificado ou inteiro como nesses exemplos. A rotina de plotagem escalará o mapa de cores de forma que os valores mínimo / máximo ccorrespondam à parte inferior / superior do mapa de cores.

Colormaps

Você pode alterar o mapa de cores adicionando

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

A importação matplotlib.cmé opcional, pois você também pode chamar mapas de cores cmap="cmap_name". Há uma página de referência de mapas de cores mostrando a aparência de cada um. Saiba também que você pode reverter um mapa de cores simplesmente chamando-o de cmap_name_r. Então também

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

vai funcionar. Os exemplos são "jet_r"ou cm.plasma_r. Aqui está um exemplo com o novo 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()

insira a descrição da imagem aqui

Colorbars

Você pode adicionar uma barra de cores usando

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

insira a descrição da imagem aqui

Observe que se você estiver usando figuras e subtramas explicitamente (por exemplo, fig, ax = plt.subplots()ou ax = fig.add_subplot(111)), adicionar uma barra de cores pode ser um pouco mais complicado. Bons exemplos podem ser encontrados aqui para uma única barra de cores de subtramas e aqui para 2 subtramas 1 barra de cores .

wflynny
fonte
1
Você pode obter uma legenda para as cores com o plt.colorbar()comando.
drevicko
O código parece ter mudado aqui.cmap = cm.colormap_name agora deve ser cmap = cm.cmapname.
Chris
@ cmarti1138 Não tenho certeza do que você quer dizer cm.colormap_namee cm.cmapnamenem das variáveis ​​reais em matplotlib.cm; é apenas pseudocódigo para cm.jetou cm.veridis_retc.
wflynny
O elemento central desta resposta é c=np.arange(len(x)).
Guimoute
10

Para adicionar à resposta de wflynny acima, você pode encontrar os mapas de cores disponíveis aqui

Exemplo:

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

ou alternativamente,

plt.scatter(x, y, c=t, cmap='jet')
Nathan
fonte
4

Subplot Colorbar

Para subtramas com dispersão, você pode enganar uma barra de cores em seus eixos construindo o "mapeável" com a ajuda de uma figura secundária e, em seguida, adicionando-a à sua trama original.

Como continuação do exemplo acima:

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

Espalhe subtramas com COLORBAR

Observe que você também produzirá uma figura secundária que pode ser ignorada.

Audelia
fonte