2015-03-22 22 views
8

Tutto quello che mi piacerebbe fare è creare un grafico a torta. La documentazione di Bokeh copre una serie di grafici sofisticati, tra cui un grafico ad anello, ma non sembra coprire il grafico a torta.Come si crea un grafico a torta usando Bokeh?

C'è qualche esempio di questo?

In definitiva, il grafico dovrà essere incorporato in una pagina Web, quindi sarà necessario sfruttare le funzionalità di incorporamento html di Bokeh.

risposta

7

Un esempio per Bokeh 0.8.1 utilizzando l'interfaccia bokeh.plotting:

from bokeh.plotting import * 
from numpy import pi 

# define starts/ends for wedges from percentages of a circle 
percents = [0, 0.3, 0.4, 0.6, 0.9, 1] 
starts = [p*2*pi for p in percents[:-1]] 
ends = [p*2*pi for p in percents[1:]] 

# a color for each pie piece 
colors = ["red", "green", "blue", "orange", "yellow"] 

p = figure(x_range=(-1,1), y_range=(-1,1)) 

p.wedge(x=0, y=0, radius=1, start_angle=starts, end_angle=ends, color=colors) 

# display/save everythin 
output_file("pie.html") 
show(p) 

Bokeh> 0.9 sarà correttamente calcolare l'area di delimitazione di tutti i glifi, non solo "puntiformi" glifi marcatori, e impostando in modo esplicito le gamme come questo non sarà richiesto.

Si può vedere l'uscita (codice modificato per visualizzare nel quaderno IPython con output_notebook) qui:

enter image description here

+1

Grande. E posso etichettarli nello stesso modo in cui etichettare altri glifi, giusto? –

+2

Esistono diversi modi per etichettare. Puoi aggiungere una legenda (https://github.com/bokeh/bokeh/blob/master/examples/plotting/file/legend.py) oppure puoi utilizzare il metodo 'text' sulla trama per aggiungere etichette di testo tu stesso. Il modo più semplice per impostare le etichette degli assi è passare, ad esempio, 'x_axis_label' alla chiamata a' figure' – bigreddot

+0

Per quelli come me che fanno schifo a Panda. Ecco come puoi ottenere le percentuali da una serie di dati: 'percententi = [0] + lista (ds.cumsum()/ds.sum()) percents = [0] + lista (ds.cumsum()/ds.sum()) '. Non so, se c'è un modo più semplice, ma ho aggiunto legende come questa: 'p = figure()' seguito da 'per inizio, fine, legenda, colore in zip (inizia, termina, lista (ds.index), colors) 'e quindi' p.wedge (color = color, legend = legend, ...) 'come sopra. E finalmente qui viene spiegato come posizionare la legenda accanto al grafico a torta (rendendolo purtroppo più piccolo): http://stackoverflow.com/questions/26254619 –

10

Un grafico Donut restituirà un grafico a torta semplice se si immette una serie panda piuttosto che un dataframe. E mostrerà anche le etichette!

from bokeh.charts import Donut, show 
import pandas as pd 
data = pd.Series([0.15,0.4,0.7,1.0], index = list('abcd')) 
pie_chart = Donut(data) 
show(pie_chart) 

Donut Chart

+0

Questa è sicuramente una soluzione più semplice, ma consiglio comunque la risposta @bigreddot, perché l'uso di wedge consente la creazione di etichette. Vedi questo problema su GitHub: https://github.com/bokeh/bokeh/issues/3843 –

+0

Nella versione bokeh 0.12.10, questo genera errore: 'ModuleNotFoundError: nessun modulo chiamato 'bokeh.charts'' – arun

+0

in Bokeh 0.12.10 bokeh.charts sono stati migrati dal core bokeh. Ora è supportato da http://holoviews.org/ –

0

Grazie alle risposte di cui sopra per avermi aiutato pure. Voglio aggiungere come aggiungere una legenda al grafico a torta perché ho avuto qualche problema con questo. Di seguito è riportato un frammento. Il mio grafico a torta aveva solo 2 sezioni. Quindi, ho appena creato un grafico a torta e l'ho chiamato due volte su zeppa:

import numpy as np 
percentAchieved = .6 
pieFigure = figure(x_range=(-1, 1), y_range=(-1, 1)) 
starts = [np.pi/2, np.pi * 2 * percentAchieved + np.pi/2] 
ends = [np.pi/2+ np.pi * 2 * percentAchieved, np.pi/2 + 2*np.pi] 
pieColors = ['blue', 'red'] 
#therefore, this first wedge will add a legend entry for the first color 'blue' and label it 'hello' 
pieFigure.wedge(x=0, y=0, radius=.7, start_angle=starts, end_angle=ends, color=pieColors, legend="hello") 
#this will add a legend entry for the 'red' color and label it 'bye'. Made radius zero to not make 
#another piechart overlapping the original one 
pieFigure.wedge(x=0, y=0, radius=0, start_angle=starts, end_angle=ends, color=pieColors[1], legend="bye") 
Problemi correlati