Ao desenhar um gráfico de barras matplotlib
usando bars = plt.bar(...)
, o objeto retornado pode ser passado plt.bar_label(bars, labels)
para fácil rotulagem.
plt.bar_label(bars, labels)
rotula todas as barras. Quero rotular apenas um subconjunto (os três primeiros), idealmente usando plt.bar_label()
. Não quero invocar
plt.text()
or plt.annotate()
.
Existe uma maneira de cortar as barras que eu quero de bars
, e rotular somente aquelas usando plt.bar_label()
?
O exemplo abaixo mostra o comportamento padrão em que todas as barras são rotuladas.
#Imports
import matplotlib.pyplot as plt
import pandas as pd
# Data for testing
values = [10, 9, 10.5, 4, 3.1, 2]
labels = [
'sensor calibration', 'sensor response', 'noise floor estimate',
'noise floor theta', 'weighted response coef', 'linear estimate'
]
#Bar plot with labels
ax = plt.figure(figsize=(5, 2)).add_subplot()
bars = ax.bar(range(6), values, color='lightgray')
ax.set(xlabel='x', ylabel='value', title='Data')
ax.spines[['top', 'right']].set_visible(False)
#Add all bar labels
label_kwargs = dict(rotation=90, weight='bold', fontsize=8, label_type='center')
ax.bar_label(bars, labels, **label_kwargs)
Você pode cortar as barras que quiser, mas então você tem que re-encapsulá-las em um
BarContainer
. O objeto resultante pode ser passadoplt.bar_label()
como antes.Uma opção fácil seria fornecer rótulos vazios para as barras que não devem ser rotuladas:
Aqui está uma variante que coloca rótulos centralizados para as barras longas e rótulos superiores para as barras mais curtas: