Tengo este marco de datos diamonds
que se compone de variables como (carat, price, color)
, y quiero dibujar un diagrama de dispersión de price
a carat
para cada una color
, lo que significa que diferente color
tiene un color diferente en el diagrama.
Esto es fácil R
con 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)
Me pregunto cómo se podría hacer esto en Python usando matplotlib
.
PD:
Sé acerca de los paquetes de trazado auxiliares, como seaborn
y ggplot for python
, y no los prefiero, solo quiero saber si es posible hacer el trabajo usando matplotlib
solo,; P
matplotlib
pandas
visualization
aguacate
fuente
fuente
Respuestas:
Puede pasar
plt.scatter
unc
argumento que le permitirá seleccionar los colores. El siguiente código define uncolors
diccionario para asignar los colores de su diamante a los colores de trazado.df['color'].apply(lambda x: colors[x])
mapea eficazmente los colores de "diamante" a "trazado".(Perdóname por no poner otra imagen de ejemplo, creo que 2 es suficiente: P)
Con
seaborn
Puede usar
seaborn
cuál es un envoltoriomatplotlib
que lo hace lucir más bonito por defecto (más bien basado en opiniones, lo sé: P) pero también agrega algunas funciones de trazado.Para esto, puede usar
seaborn.lmplot
confit_reg=False
(lo que evita que automáticamente haga alguna regresión).El siguiente código utiliza un conjunto de datos de ejemplo. Al seleccionar,
hue='color'
le dice a seaborn que divida su marco de datos en función de sus colores y luego trace cada uno.Sin
seaborn
usarpandas.groupby
Si no desea usar seaborn, puede usar
pandas.groupby
para obtener los colores solo y luego trazarlos usando solo matplotlib, pero tendrá que asignar colores manualmente a medida que avanza, agregué un ejemplo a continuación:Este código asume el mismo DataFrame que el anterior y luego lo agrupa en función de
color
. Luego itera sobre estos grupos, trazando para cada uno. Para seleccionar un color, he creado uncolors
diccionario que puede asignar el color del diamante (por ejemploD
) a un color real (por ejemplored
).fuente
groupby
mí podría hacer eso, por lo que existe una característicamatplotlib
que puede dibujar automáticamente para diferentes niveles de una categoría usando diferentes colores, ¿verdad?groupby
ejemplo.ax.scatter
, ¿cómo le agregarías leyendas? Estoy tratando de usarlabel=df['color']
y luegoplt.legend()
sin éxito.ax.scatter(df['carat'], df['price'], c=df['color'].apply(lambda x: colors[x]))
aax.scatter(df['carat'], df['price'], c=df['color'].map(colors)
Aquí hay una solución sucinta y genérica para usar una paleta de colores marina.
Primero busque una paleta de colores que le guste y, opcionalmente, visualícela:
Entonces puedes usarlo para
matplotlib
hacer esto:fuente
8
insns.color_palette("Set2", 8)
porlen(color_labels)
.Tenía la misma pregunta y me he pasado todo el día probando diferentes paquetes.
Originalmente había usado matlibplot: y no estaba contento con la asignación de categorías a colores predefinidos; o agrupando / agregando luego iterando a través de los grupos (y aún teniendo que mapear colores). Simplemente sentí que era una implementación deficiente del paquete.
Seaborn no funcionaría en mi caso, y Altair SOLO funciona dentro de un Jupyter Notebook.
La mejor solución para mí fue PlotNine, que "es una implementación de una gramática de gráficos en Python y está basada en ggplot2".
A continuación se muestra el código plotnine para replicar su ejemplo de R en Python:
Tan limpio y simple :)
fuente
Usando Altair .
fuente
Aquí una combinación de marcadores y colores de un mapa de colores cualitativo en
matplotlib
:fuente
mpl.cm.Dark2.colors
-mpl
no parece estar definido en su código yDark2
no tiene atributocolors
.matplotlib
comompl
, he corregido mi código usandoplt
que también contienecm
. Al menos en lamatplotlib
versión que estoy usando 2.0.0Dark2
tiene atributocolors
Con df.plot ()
Normalmente, cuando trazo rápidamente un DataFrame, uso
pd.DataFrame.plot()
. Esto toma el índice como el valor x, el valor como el valor y y traza cada columna por separado con un color diferente. Un DataFrame en esta forma se puede lograr usandoset_index
yunstack
.Con este método no es necesario especificar los colores manualmente.
Este procedimiento puede tener más sentido para otras series de datos. En mi caso, tengo datos de series de tiempo, por lo que MultiIndex consta de fecha y hora y categorías. También es posible utilizar este enfoque para colorear más de una columna, pero la leyenda se está complicando.
fuente
Normalmente lo hago usando Seaborn, que está construido sobre matplotlib
fuente