2015-03-22 9 views
8

Wszystko, co chciałbym zrobić, to utworzyć wykres kołowy. Dokumentacja Bokeh obejmuje szereg wyrafinowanych wykresów, w tym wykres pączków, ale nie obejmuje ona wykresu kołowego.Jak utworzyć wykres kołowy za pomocą Bokeh?

Czy jest jakiś przykład tego?

Ostatecznie wykres będzie musiał być osadzony na stronie internetowej, więc będę musiał skorzystać z możliwości osadzania html Bokeh.

Odpowiedz

7

Przykładem Bokeh 0.8.1 za pomocą interfejsu 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 poprawnie obliczyć powierzchnię ograniczającą wszystkich glifów, nie tylko „pointlike” glify markera i wyraźnie ustalone zakresy jak to nie będzie wymagane.

Można zobaczyć wyjście (kod zmodyfikowany, aby wyświetlić w notatniku ipython z output_notebook) tutaj:

enter image description here

+1

Świetnie. Mogę je etykietować w ten sam sposób, w jaki będę oznaczać inne glify, prawda? –

+2

Istnieje kilka sposobów na oznaczanie. Możesz dodać legendę (https://github.com/bokeh/bokeh/blob/master/examples/plotting/file/legend.py) lub możesz użyć metody 'text' na działce, aby dodać etykiety tekstowe. Najprostszym sposobem ustawienia etykiet osi jest przekazanie np. "X_axis_label" do połączenia z 'figure' – bigreddot

+0

Dla takich jak ja, którzy ssą w Pandas. W ten sposób możesz uzyskać "procenty" z serii danych: 'procenty = [0] + lista (ds.cumsum()/ds.sum()) procenty = [0] + lista (ds.cumsum()/ds.sum()) '. Nie wiem, czy jest łatwiejszy sposób, ale dodałem takie legendy: 'p = figure()', po którym następuje 'dla początku, końca, legendy, koloru w zip (początki, końce, lista (ds.indeks), colors) ', a następnie' p.wedge (color = color, legend = legend, ...) 'jak wyżej. I na koniec tutaj wyjaśniono, jak umieścić legendę obok wykresu kołowego (co niestety zmniejsza): http://stackoverflow.com/questions/26254619 –

10

Donut wykres powróci prosty wykres kołowy, kiedy zostaje wprowadzona seria pandy zamiast ramka danych. I wyświetli też etykiety!

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

To zdecydowanie łatwiejsze rozwiązanie, ale nadal polecałbym odpowiedź @bigreddot, ponieważ użycie klinów pozwala na tworzenie etykiet. Zobacz ten problem z GitHub: https://github.com/bokeh/bokeh/issues/3843 –

+0

W wersji bokeh 0.12.10, ten błąd powoduje: 'ModuleNotFoundError: Brak modułu o nazwie" bokeh.charts'' – arun

+0

w Bokeh 0.12.10 bokeh.charts zostały przeniesione z rdzenia bokeh. Jest teraz obsługiwany przez http://holoviews.org/ –

0

Dzięki powyższych odpowiedzi za pomoc, jak również. Chcę dodać, jak dodać legendę do wykresu kołowego, ponieważ miałem z tym problem. Poniżej znajduje się tylko fragment. Mój piechart miał tylko 2 sekcje. W związku z tym właśnie utworzyłem rysunek wykresu kołowego i wywołałem go dwukrotnie:

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")