Eu tenho esse quadro de dados diamonds
que é composto de variáveis como (carat, price, color)
, e quero desenhar um gráfico de dispersão de price
a carat
para cada um color
, o que significa que diferente color
tem cores diferentes no gráfico.
Isso é fácil R
com ggplot
:
ggplot(aes(x=carat, y=price, color=color), #by setting color=color, ggplot automatically draw in different colors
data=diamonds) + geom_point(stat='summary', fun.y=median)
Eu me pergunto como isso poderia ser feito em Python usando matplotlib
?
PS:
Conheço pacotes auxiliares de plotagem, como seaborn
e ggplot for python
, e não os prefiro, só quero saber se é possível fazer o trabalho usando matplotlib
sozinho,; P
matplotlib
pandas
visualization
abacate
fonte
fonte
Respostas:
Você pode passar
plt.scatter
umc
argumento que lhe permitirá selecionar as cores. O código a seguir define umcolors
dicionário para mapear as cores do diamante para as cores de plotagem.df['color'].apply(lambda x: colors[x])
mapeia efetivamente as cores de "diamante" para "plotagem".(Perdoe-me por não colocar outra imagem de exemplo, acho que 2 é o suficiente: P)
Com
seaborn
Você pode usar o
seaborn
que é um invólucromatplotlib
que o torna mais bonito por padrão (em vez de baseado em opinião, eu sei: P), mas também adiciona algumas funções de plotagem.Para isso, você pode usar
seaborn.lmplot
comfit_reg=False
(o que o impede de fazer alguma regressão automaticamente).O código a seguir usa um conjunto de dados de exemplo. Ao selecionar,
hue='color'
você diz ao seaborn para dividir seu dataframe com base em suas cores e, em seguida, plotar cada uma.Sem
seaborn
usarpandas.groupby
Se você não quiser usar seaborn, você pode usar
pandas.groupby
para obter as cores sozinhas e, em seguida, plotá-las usando apenas matplotlib, mas você terá que atribuir cores manualmente à medida que avança. Eu adicionei um exemplo abaixo:Este código assume o mesmo DataFrame acima e, a seguir, o agrupa com base em
color
. Em seguida, itera sobre esses grupos, traçando para cada um. Para selecionar uma cor, criei umcolors
dicionário que pode mapear a cor do diamante (por exemploD
) para uma cor real (por exemplored
).fonte
groupby
eu poderia fazer isso, então existe um recursomatplotlib
que pode desenhar automaticamente para diferentes níveis de uma categoria usando cores diferentes, certo?groupby
exemplo.ax.scatter
, como você adicionaria legendas a ele? Estou tentando usarlabel=df['color']
e depoisplt.legend()
sem sucesso.ax.scatter(df['carat'], df['price'], c=df['color'].apply(lambda x: colors[x]))
paraax.scatter(df['carat'], df['price'], c=df['color'].map(colors)
Aqui está uma solução sucinta e genérica para usar uma paleta de cores do mar.
Primeiro, encontre uma paleta de cores de que goste e, opcionalmente, visualize-a:
Em seguida, você pode usá-lo com
matplotlib
isso:fonte
8
emsns.color_palette("Set2", 8)
porlen(color_labels)
.Usando Altair .
fonte
Eu tive a mesma pergunta e passei o dia todo testando diferentes pacotes.
Eu tinha usado originalmente matlibplot: e não estava feliz com nenhuma das categorias de mapeamento para cores predefinidas; ou agrupando / agregando e iterando através dos grupos (e ainda tendo que mapear cores). Eu apenas senti que era uma implementação ruim do pacote.
Seaborn não funcionaria no meu caso, e Altair SÓ funciona dentro de um Notebook Jupyter.
A melhor solução para mim foi PlotNine, que "é uma implementação de uma gramática de gráficos em Python, e baseada em ggplot2".
Abaixo está o código plotnine para replicar seu exemplo R em Python:
Tão limpo e simples :)
fonte
Aqui está uma combinação de marcadores e cores de um mapa de cores qualitativo em
matplotlib
:fonte
mpl.cm.Dark2.colors
-mpl
não parece estar definido em seu código eDark2
não tem atributocolors
.matplotlib
comompl
, corrigi meu código usando oplt
que também contémcm
. Pelo menos namatplotlib
versão que estou usando 2.0.0Dark2
tem atributocolors
Com df.plot ()
Normalmente, quando traço um DataFrame rapidamente, eu uso
pd.DataFrame.plot()
. Isso leva o índice como o valor x, o valor como o valor y e plota cada coluna separadamente com uma cor diferente. Um DataFrame neste formulário pode ser obtido usandoset_index
eunstack
.Com esse método, você não precisa especificar as cores manualmente.
Este procedimento pode fazer mais sentido para outras séries de dados. No meu caso, tenho dados de série temporal, portanto, o MultiIndex consiste em data e hora e categorias. Também é possível usar essa abordagem para mais de uma coluna para colorir, mas a legenda está ficando uma bagunça.
fonte
Eu normalmente faço isso usando o Seaborn, que é construído em cima do matplotlib
fonte