Cómo mostrar el valor en barras horizontales
Generé un diagrama de barras, ¿cómo puedo mostrar el valor de la barra en cada barra?
Trama actual:
Lo que estoy tratando de conseguir:
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
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:
Los valores de y v
son tanto la ubicación x como los valores de cadena para ax.text
y, convenientemente, el diagrama de barras tiene una métrica de 1 para cada barra, por lo que la enumeración i
es la ubicación y.
Nuevo en matplotlib 3.4.0
Ahora hay un método auxiliar integrado Axes.bar_label
para 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
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:
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)
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:
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: