Cómo mostrar el valor en barras horizontales

Resuelto Franck Dernoncourt asked hace 9 años • 11 respuestas

Generé un diagrama de barras, ¿cómo puedo mostrar el valor de la barra en cada barra?

Trama actual:

ingrese la descripción de la imagen aquí

Lo que estoy tratando de conseguir:

ingrese la descripción de la imagen aquí

Mi código:

import os
import numpy as np
import matplotlib.pyplot as plt
        
x = [u'INFO', u'CUISINE', u'TYPE_OF_PLACE', u'DRINK', u'PLACE', u'MEAL_TIME', u'DISH', u'NEIGHBOURHOOD']
y = [160, 167, 137, 18, 120, 36, 155, 130]

fig, ax = plt.subplots()    
width = 0.75 # the width of the bars 
ind = np.arange(len(y))  # the x locations for the groups
ax.barh(ind, y, width, color="blue")
ax.set_yticks(ind+width/2)
ax.set_yticklabels(x, minor=False)
plt.title('title')
plt.xlabel('x')
plt.ylabel('y')      
#plt.show()
plt.savefig(os.path.join('test.png'), dpi=300, format='png', bbox_inches='tight') # use format='svg' or 'pdf' for vectorial pictures
Franck Dernoncourt avatar May 14 '15 08:05 Franck Dernoncourt
Aceptado

Actualización: ¡ahora hay un método integrado para esto! Desplácese hacia abajo para ver un par de respuestas a "Nuevo en matplotlib 3.4.0".

Si no puede actualizar hasta ese punto, no se necesita mucho código. Agregar:

for i, v in enumerate(y):
    ax.text(v + 3, i + .25, str(v), color='blue', fontweight='bold')

resultado:

ingrese la descripción de la imagen aquí

Los valores de y vson tanto la ubicación x como los valores de cadena para ax.texty, convenientemente, el diagrama de barras tiene una métrica de 1 para cada barra, por lo que la enumeración ies la ubicación y.

cphlewis avatar May 14 '2015 04:05 cphlewis

Nuevo en matplotlib 3.4.0

Ahora hay un método auxiliar integrado Axes.bar_labelpara etiquetar automáticamente las barras:

fig, ax = plt.subplots()
bars = ax.barh(indexes, values)

ax.bar_label(bars)

Tenga en cuenta que para los gráficos de barras agrupadas/apiladas, habrá varios contenedores de barras, a los que se puede acceder a través de ax.containers:

for bars in ax.containers:
    ax.bar_label(bars)

Más detalles:

  • Cómo agregar separadores de miles (comas) a las etiquetas
  • Cómo aplicar cadenas f a etiquetas
  • Cómo agregar espacios a las etiquetas

tdy avatar Jun 23 '2021 22:06 tdy

He notado que el código de ejemplo de API contiene un ejemplo de gráfico de barras con el valor de la barra que se muestra en cada barra:

"""
========
Barchart
========

A bar plot with errorbars and height labels on individual bars
"""
import numpy as np
import matplotlib.pyplot as plt

N = 5
men_means = (20, 35, 30, 35, 27)
men_std = (2, 3, 4, 1, 2)

ind = np.arange(N)  # the x locations for the groups
width = 0.35       # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(ind, men_means, width, color='r', yerr=men_std)

women_means = (25, 32, 34, 20, 25)
women_std = (3, 5, 2, 3, 3)
rects2 = ax.bar(ind + width, women_means, width, color='y', yerr=women_std)

# add some text for labels, title and axes ticks
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind + width / 2)
ax.set_xticklabels(('G1', 'G2', 'G3', 'G4', 'G5'))

ax.legend((rects1[0], rects2[0]), ('Men', 'Women'))


def autolabel(rects):
    """
    Attach a text label above each bar displaying its height
    """
    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width()/2., 1.05*height,
                '%d' % int(height),
                ha='center', va='bottom')

autolabel(rects1)
autolabel(rects2)

plt.show()

producción:

ingrese la descripción de la imagen aquí

Para su información, ¿cuál es la unidad de la variable de altura en "barh" de matplotlib? (a partir de ahora, no existe una manera fácil de establecer una altura fija para cada barra)

Franck Dernoncourt avatar Feb 28 '2017 01:02 Franck Dernoncourt

Utilice plt.text() para poner texto en la trama.

Ejemplo:

import matplotlib.pyplot as plt
N = 5
menMeans = (20, 35, 30, 35, 27)
ind = np.arange(N)

#Creating a figure with some fig size
fig, ax = plt.subplots(figsize = (10,5))
ax.bar(ind,menMeans,width=0.4)
#Now the trick is here.
#plt.text() , you need to give (x,y) location , where you want to put the numbers,
#So here index will give you x pos and data+1 will provide a little gap in y axis.
for index,data in enumerate(menMeans):
    plt.text(x=index , y =data+1 , s=f"{data}" , fontdict=dict(fontsize=20))
plt.tight_layout()
plt.show()

Esto mostrará la figura como:

gráfico de barras con valores en la parte superior

Anirvan Sen avatar Apr 26 '2019 11:04 Anirvan Sen

Para cualquiera que quiera tener su etiqueta en la base de sus barras, simplemente divida v por el valor de la etiqueta de esta manera:

for i, v in enumerate(labels):
    axes.text(i-.25, 
              v/labels[i]+100, 
              labels[i], 
              fontsize=18, 
              color=label_color_list[i])

(nota: agregué 100 para que no estuviera absolutamente en la parte inferior)

Para obtener un resultado como este: ingrese la descripción de la imagen aquí

Skromak avatar Nov 23 '2018 20:11 Skromak