Python >> Tutoriel Python >  >> Python Tag >> Bokeh

Comment ajouter des étiquettes de données à un graphique à barres dans Bokeh ?

Utiliser le jeu d'étiquettes

Utilisez Labelset pour créer une étiquette sur chaque barre individuelle

Dans mon exemple, j'utilise vbar avec l'interface de traçage, c'est un peu plus bas que l'interface Charts, mais il pourrait y avoir un moyen de l'ajouter dans le graphique à barres.

from bokeh.palettes import PuBu
from bokeh.io import show, output_notebook
from bokeh.models import ColumnDataSource, ranges, LabelSet
from bokeh.plotting import figure
output_notebook()

source = ColumnDataSource(dict(x=['Áætlaðir','Unnir'],y=[576,608]))

x_label = ""
y_label = "Tímar (klst)"
title = "Tímar; núllti til þriðji sprettur."
plot = figure(plot_width=600, plot_height=300, tools="save",
        x_axis_label = x_label,
        y_axis_label = y_label,
        title=title,
        x_minor_ticks=2,
        x_range = source.data["x"],
        y_range= ranges.Range1d(start=0,end=700))


labels = LabelSet(x='x', y='y', text='y', level='glyph',
        x_offset=-13.5, y_offset=0, source=source, render_mode='canvas')

plot.vbar(source=source,x='x',top='y',bottom=0,width=0.3,color=PuBu[7][2])

plot.add_layout(labels)
show(plot)

Pour en savoir plus sur le jeu d'étiquettes, cliquez ici :Annotations bokeh


NOTE DES MAINTENEURS DE BOKEH Les parties de la réponse ci-dessous qui font référence au bokeh.charts n'ont qu'un intérêt historique. Le bokeh.charts L'API a été obsolète puis supprimée de Bokeh. Voir les réponses ici et ci-dessus pour des informations sur l'écurie bokeh.plotting API

Oui, vous pouvez ajouter des étiquettes à chaque barre du graphique. Il y a quelques façons de le faire. Par défaut, vos libellés sont liés à vos données. Mais vous pouvez modifier ce qui est affiché. Voici quelques façons de le faire en utilisant votre exemple :

from bokeh.charts import Bar, output_file, show
from bokeh.sampledata.autompg import autompg as df
from bokeh.layouts import gridplot

from pandas import DataFrame
from bokeh.plotting import figure, ColumnDataSource
from bokeh.models import Range1d, HoverTool

# output_file("bar.html")

""" Adding some sample labels a few different ways.
    Play with the sample data and code to get an idea what does what.
    See below for output.
"""

Exemples de données (nouveaux libellés) :

J'ai utilisé une certaine logique pour déterminer la nouvelle colonne de dataframe. Bien sûr, vous pouvez utiliser une autre colonne déjà dans df (tout dépend des données sur lesquelles vous travaillez). Tout ce dont vous avez vraiment besoin ici est de fournir une nouvelle colonne au dataframe.

# One method
labels = []
for number in df['cyl']:
    if number == 3:
        labels.append("three")
    if number == 4:
        labels.append("four")
    if number == 5:
        labels.append("five")
    if number == 6:
        labels.append("six")
    if number == 8:
        labels.append("eight")

df['labels'] = labels

Une autre façon d'obtenir une nouvelle colonne de dataframe. Encore une fois, nous avons juste besoin de fournir df une nouvelle colonne à utiliser sur notre diagramme à barres.

# Another method
def new_labels(x):
    if x % 2 != 0 or x == 6:
        y = "Inline"
    elif x % 2 == 0:
        y = "V"
    else:
        y = "nan"
    return y

df["more_labels"] = df["cyl"].map(new_labels)

Maintenant, le graphique à barres :

Je l'ai fait de deux manières. p1 spécifie simplement les nouvelles étiquettes. Notez que parce que j'ai utilisé des chaînes, cela les a mises par ordre alphabétique sur le graphique. p2 utilise les étiquettes d'origine et ajoute mes nouvelles étiquettes sur la même barre.

# Specifying your labels
p1 = Bar(df, label='labels', values='mpg',
         title="Total MPG by CYL, remapped labels, p1",
         width=400, height=400, legend="top_right")
p2 = Bar(df, label=['cyl', 'more_labels'], values='mpg',
         title="Total MPG by CYL, multiple labels, p2", width=400, height=400,
         legend="top_right")

Autre façon :

Bokeh a trois "niveaux d'interface" principaux. charts de haut niveau offre un accès rapide et facile mais des fonctionnalités limitées ; plotting qui donne plus d'options ; models offre encore plus d'options.

Ici, j'utilise l'interface de traçage et le Figure classe qui contient un rect méthode. Cela vous donne un contrôle plus détaillé de votre graphique.

# Plot with "intermediate-level" bokeh.plotting interface
new_df = DataFrame(df.groupby(['cyl'])['mpg'].sum())
factors = ["three", "four", "five", "six", "eight"]
ordinate = new_df['mpg'].tolist()
mpg = [x * 0.5 for x in ordinate]

p3 = figure(x_range=factors, width=400, height=400,
            title="Total MPG by CYL, using 'rect' instead of 'bar', p3")
p3.rect(factors, y=mpg, width=0.75, height=ordinate)
p3.y_range = Range1d(0, 6000)
p3.xaxis.axis_label = "x axis name"
p3.yaxis.axis_label = "Sum(Mpg)"

Quatrième façon d'ajouter des libellés spécifiques :

Ici, j'utilise le hover outil de tracé. Passez la souris sur chaque barre pour afficher l'étiquette que vous avez spécifiée.

# With HoverTool, using 'quad' instead of 'rect'
top = [int(x) for x in ordinate]
bottom = [0] * len(top)
left = []
[left.append(x-0.2) for x in range(1, len(top)+1)]
right = []
[right.append(x+0.2) for x in range(1, len(top)+1)]
cyl = ["three", "four", "five", "six", "eight"]
source = ColumnDataSource(
    data=dict(
        top=[int(x) for x in ordinate],
        bottom=[0] * len(top),
        left=left,
        right=right,
        cyl=["three", "four", "five", "six", "eight"],
    )
)

hover = HoverTool(
    tooltips=[
        ("cyl", "@cyl"),
        ("sum", "@top")
    ]
)

p4 = figure(width=400, height=400,
            title="Total MPG by CYL, with HoverTool and 'quad', p4")
p4.add_tools(hover)
p4.quad(top=[int(x) for x in ordinate], bottom=[0] * len(top),
        left=left, right=right, color="green", source=source)
p4.xaxis.axis_label = "x axis name"

Afficher les quatre graphiques dans une grille :

grid = gridplot([[p1, p2], [p3, p4]])
show(grid)

Ce sont les moyens que je connais. Il peut y en avoir d'autres. Changez ce que vous voulez pour répondre à vos besoins. Voici ce que l'exécution de tout cela produira (vous devrez l'exécuter ou le servir pour obtenir l'hovertool) :