Gráfico de dispersão Matplotlib; cor em função de uma terceira variável

152

Eu quero fazer um gráfico de dispersão (usando matplotlib) em que os pontos sejam sombreados de acordo com uma terceira variável. Eu tenho muito perto disso:

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

onde we M são os pontos de dados ep é a variável que eu quero sombrear em relação a.
No entanto, quero fazê-lo em escala de cinza em vez de em cores. Alguém pode ajudar?

Thomas Collett
fonte

Respostas:

156

Não há necessidade de definir manualmente as cores. Em vez disso, especifique um mapa de cores em escala de cinza ...

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

insira a descrição da imagem aqui

Ou, se você preferir uma gama mais ampla de mapas de cores , também pode especificar o cmapkwarg para scatter. Para usar a versão reversa de qualquer um deles, basta especificar a " _r" versão de qualquer um deles. Por exemplo, em gray_rvez de gray. Existem vários mapas de cores diferentes tons de cinza pré-fabricados (por exemplo gray, gist_yarg, binary, etc.).

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
fonte
1
Obrigado! Existe alguma maneira de desenhar contornos em torno desses pontos contendo uma certa quantidade do peso total?
Thomas Collett
6
mpl.cmtambém está disponível diretamente como plt.cm.
heltonbiker
@Thomas Collet: Se você quiser desenhar contornos, você tem que interpolar os dados formam os pontos a uma matriz 2D, então traçar que o uso plt.contour()ou plt.contourf()- mas isso é uma questão diferente
Zak
Como você pode adicionar o rótulo na legenda? Nesse caso, com números contínuos, suspeito que você usaria a barra de cores. E no caso de valores discretos? por exemplo, eu poderia adicionar três marcadores na legenda para minhas três categorias?
Nate
26

No matplotlib, as cores cinza podem ser fornecidas como uma sequência de um valor numérico entre 0-1.
Por exemploc = '0.1'

Depois, você pode converter sua terceira variável em um valor dentro desse intervalo e usá-la para colorir seus pontos.
No exemplo a seguir, usei a posição y do ponto como o valor que determina a cor:

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

insira a descrição da imagem aqui

joaquin
fonte
3
Para o registro, você pode aplicar ALPHA como um mapa de cores se você fornecer uma matriz em forma de (n, 4) como cargumento, com valores alfa na quarta coluna. Se a terceira variável for Z, com shape=(n,1), então colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max()))produz um efeito muito agradável (é claro que pode ser ajustado).
Heltonbiker # 13/13
Eu recebo um erro: 'o comprimento da sequência rgba deve ser 3 ou 4'
MattCochrane 4/15
1
@MattClimbs Suspeito que você esteja chamando plt.plot em vez de plt.scatter, como no exemplo.
Smashbro
como você adiciona uma barra de cores a esse gráfico?
FaCoffee
2
@FaCoffee plt.colorbar()vai fazer isso
Mathew Savage
10

Às vezes, pode ser necessário plotar cores com precisão, com base no caso de valor x . Por exemplo, você pode ter um quadro de dados com 3 tipos de variáveis ​​e alguns pontos de dados. E você quer fazer o seguinte,

  • Plotar pontos correspondentes à variável física 'A' em RED.
  • Plotar pontos correspondentes à variável física 'B' em AZUL.
  • Plotar pontos correspondentes à variável física 'C' em VERDE.

Nesse caso, pode ser necessário gravar na função abreviada para mapear os valores x para os nomes de cores correspondentes como uma lista e depois passar essa lista para o plt.scattercomando.

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

Gráfico de dispersão para colorir em função da variável x

Tirtha
fonte
como criar uma barra de cores para esse gráfico?
Maryam Rahmani Moghaddam