如何使用 Bokeh 创建饼图?
How do I create a pie chart using Bokeh?
我只想创建一个饼图。 Bokeh 文档涵盖了许多复杂的图表,包括圆环图,但它似乎没有涵盖饼图。
有这方面的例子吗?
最终,图表需要嵌入到网页中,因此我需要利用 Bokeh 的 html 嵌入功能。
下面的答案已经过时了。 Donut
函数是旧的 bokeh.charts
API 的一部分,很久以前就被弃用并删除了。对于任何现代版本的 Bokeh(例如 0.13 或更新版本),您都可以使用楔形字形创建饼图,如下所示:
from math import pi
import pandas as pd
from bokeh.io import output_file, show
from bokeh.palettes import Category20c
from bokeh.plotting import figure
from bokeh.transform import cumsum
x = { 'United States': 157, 'United Kingdom': 93, 'Japan': 89, 'China': 63,
'Germany': 44, 'India': 42, 'Italy': 40, 'Australia': 35,
'Brazil': 32, 'France': 31, 'Taiwan': 31, 'Spain': 29 }
data = pd.Series(x).reset_index(name='value').rename(columns={'index':'country'})
data['angle'] = data['value']/data['value'].sum() * 2*pi
data['color'] = Category20c[len(x)]
p = figure(plot_height=350, title="Pie Chart", toolbar_location=None,
tools="hover", tooltips="@country: @value")
p.wedge(x=0, y=1, radius=0.4,
start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
line_color="white", fill_color='color', legend='country', source=data)
show(p)
以下已过时
使用 bokeh.plotting
接口的 Bokeh 0.8.1 示例:
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 将正确计算所有字形的边界区域,而不仅仅是 "pointlike" 标记字形,并且不需要像这样明确设置范围。
项目维护者的注释:这个答案指的是很久以前从散景中删除的旧 bokeh.charts
API
如果您输入 pandas 系列而不是数据框,Donut
图表将是 return 一个简单的饼图。它也会显示标签!
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)
也感谢上面的回答对我的帮助。我想添加如何向您的饼图添加图例,因为我在这方面遇到了一些麻烦。下面只是一个片段。我的饼图只有 2 个部分。因此,我只是做了一个饼图,并在上面调用了两次 wedge:
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")
我只想创建一个饼图。 Bokeh 文档涵盖了许多复杂的图表,包括圆环图,但它似乎没有涵盖饼图。
有这方面的例子吗?
最终,图表需要嵌入到网页中,因此我需要利用 Bokeh 的 html 嵌入功能。
下面的答案已经过时了。 Donut
函数是旧的 bokeh.charts
API 的一部分,很久以前就被弃用并删除了。对于任何现代版本的 Bokeh(例如 0.13 或更新版本),您都可以使用楔形字形创建饼图,如下所示:
from math import pi
import pandas as pd
from bokeh.io import output_file, show
from bokeh.palettes import Category20c
from bokeh.plotting import figure
from bokeh.transform import cumsum
x = { 'United States': 157, 'United Kingdom': 93, 'Japan': 89, 'China': 63,
'Germany': 44, 'India': 42, 'Italy': 40, 'Australia': 35,
'Brazil': 32, 'France': 31, 'Taiwan': 31, 'Spain': 29 }
data = pd.Series(x).reset_index(name='value').rename(columns={'index':'country'})
data['angle'] = data['value']/data['value'].sum() * 2*pi
data['color'] = Category20c[len(x)]
p = figure(plot_height=350, title="Pie Chart", toolbar_location=None,
tools="hover", tooltips="@country: @value")
p.wedge(x=0, y=1, radius=0.4,
start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
line_color="white", fill_color='color', legend='country', source=data)
show(p)
以下已过时
使用 bokeh.plotting
接口的 Bokeh 0.8.1 示例:
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 将正确计算所有字形的边界区域,而不仅仅是 "pointlike" 标记字形,并且不需要像这样明确设置范围。
项目维护者的注释:这个答案指的是很久以前从散景中删除的旧 bokeh.charts
API
如果您输入 pandas 系列而不是数据框,Donut
图表将是 return 一个简单的饼图。它也会显示标签!
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)
也感谢上面的回答对我的帮助。我想添加如何向您的饼图添加图例,因为我在这方面遇到了一些麻烦。下面只是一个片段。我的饼图只有 2 个部分。因此,我只是做了一个饼图,并在上面调用了两次 wedge:
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")