Gráfico de barras Seaborn – Visualización de valores

Estoy mirando para ver cómo hacer dos cosas en Seaborn usando un gráfico de barras para mostrar los valores que están en el dataframe, pero no en el gráfico

1) Estoy buscando mostrar los valores de un campo en un dataframe mientras graficar otro. Por ejemplo, a continuación, estoy graficando ‘punta’, pero me gustaría colocar el valor de ‘total_bill’ centrado sobre cada una de las barras (ie325.88 sobre el viernes, 1778.40 sobre el sábado, etc.)

2) ¿Hay una manera de escalar los colores de las barras, con el valor más bajo de ‘total_bill’ teniendo el color más claro (en este caso el viernes) y el valor más alto de ‘total_bill’ teniendo el más oscuro. Obviamente, me quedo con un color (es decir, azul) cuando hago la escala.

¡Gracias! Estoy seguro de que esto es fácil, pero me lo estoy perdiendo ..

Mientras veo que otros piensan que esto es un duplicado de otro problema (o dos), me falta la parte de cómo uso un valor que no está en el gráfico como base para la etiqueta o el sombreado. Como digo, use total_bill como la base. Lo siento, pero no puedo entenderlo en base a esas respuestas.

Comenzando con el siguiente código,

import pandas as pd import seaborn as sns %matplotlib inline df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata- book/master/ch08/tips.csv", sep=',') groupedvalues=df.groupby('day').sum().reset_index() g=sns.barplot(x='day',y='tip',data=groupedvalues) 

Obtengo el siguiente resultado:

introduzca la descripción de la imagen aquí

Solución interina:

 for index, row in groupedvalues.iterrows(): g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center") 

introduzca la descripción de la imagen aquí

En el sombreado , usando el siguiente ejemplo, probé lo siguiente:

 import pandas as pd import seaborn as sns %matplotlib inline df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',') groupedvalues=df.groupby('day').sum().reset_index() pal = sns.color_palette("Greens_d", len(data)) rank = groupedvalues.argsort().argsort() g=sns.barplot(x='day',y='tip',data=groupedvalues) for index, row in groupedvalues.iterrows(): g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center") 

Pero eso me dio el siguiente error:

AttributeError: el objeto ‘DataFrame’ no tiene atributo ‘argsort’

Así que intenté una modificación:

 import pandas as pd import seaborn as sns %matplotlib inline df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',') groupedvalues=df.groupby('day').sum().reset_index() pal = sns.color_palette("Greens_d", len(data)) rank=groupedvalues['total_bill'].rank(ascending=True) g=sns.barplot(x='day',y='tip',data=groupedvalues,palette=np.array(pal[::-1])[rank]) 

y eso me deja con

IndexError: el índice 4 está fuera de los límites para el eje 0 con tamaño 4

Mantengámonos en la solución de la pregunta vinculada ( Cambio de la escala de color en la gráfica de barras marítimas ). Desea utilizar argsort para determinar el orden de los colores que se utilizarán para colorear las barras. En la pregunta vinculada, argsort se aplica a un objeto Series, que funciona bien, mientras que aquí tiene un DataFrame. Por lo tanto, debe seleccionar una columna de ese DataFrame para aplicar argsort.

 import seaborn as sns import matplotlib.pyplot as plt import numpy as np df = sns.load_dataset("tips") groupedvalues=df.groupby('day').sum().reset_index() pal = sns.color_palette("Greens_d", len(groupedvalues)) rank = groupedvalues["total_bill"].argsort().argsort() g=sns.barplot(x='day',y='tip',data=groupedvalues, palette=np.array(pal[::-1])[rank]) for index, row in groupedvalues.iterrows(): g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center") plt.show() 

introduzca la descripción de la imagen aquí


El segundo bash también funciona bien, el único problema es que el rango devuelto por rank() comienza en 1 lugar de cero. Así que uno tiene que restar 1 de la matriz. También para la indexación necesitamos valores enteros, por lo que necesitamos convertirlo en int .

 rank = groupedvalues['total_bill'].rank(ascending=True).values rank = (rank-1).astype(np.int) 

Funciona con hacha simple o con matriz de hacha (subplots).

 from matplotlib import pyplot as plt import numpy as np def show_values_on_bars(axs): def _show_on_single_plot(ax): for p in ax.patches: _x = p.get_x() + p.get_width() / 2 _y = p.get_y() + p.get_height() value = '{:.2f}'.format(p.get_height()) ax.text(_x, _y, value, ha="center") if isinstance(axs, np.ndarray): for idx, ax in np.ndenumerate(axs): _show_on_single_plot(ax) else: _show_on_single_plot(axs) fig, ax = plt.subplots(1, 2) show_values_on_bars(ax) 

Espero que esto ayude con el artículo 2: a) Puede ordenar por factura total y luego restablecer el índice a esta columna b) Use palette = “Blue” para usar este color para escalar su gráfico de azul claro a azul oscuro (si es azul oscuro azul claro luego use palette = “Blues_d”)

 import pandas as pd import seaborn as sns %matplotlib inline df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',') groupedvalues=df.groupby('day').sum().reset_index() groupedvalues=groupedvalues.sort_values('total_bill').reset_index() g=sns.barplot(x='day',y='tip',data=groupedvalues, palette="Blues")