Python Bokeh数据可视化教程
Bokeh是一个交互式Python数据可视化库,以现代Web浏览器为对象进行演示。
Python Bokeh库旨在以快速,简便的方式和优雅的方式,在非常大的甚至是流数据集上,以新颖的图形的简洁结构提供高性能的交互性。
1. Python Bokeh库
Bokeh提供简单,灵活和强大的功能,并提供两个界面级别:
Bokeh.models:一个低级接口,为应用程序开发人员提供了最大的灵活性。
Bokeh.plotting:组成视觉字形的高级界面。
2.Bokeh依赖
在开始Bokeh之前,我们需要在计算机上安装NumPy。
3.安装Bokeh模块
安装bokeh及其依赖项的最简单方法是使用conda或者pip。
要使用conda进行安装,请打开终端并运行以下命令:
sudo conda install bokeh
要使用pip进行安装,请打开终端并运行以下命令:
sudo pip install bokeh
4.验证Bokeh模块的安装
我们可以使用某些命令来验证Bokeh是否已正确安装。
但是,我们将制作一个非常小的程序来提供Bokeh输出以验证其是否正常运行。
from bokeh.plotting import figure, output_file, show
output_file("test.html")
plot = figure()
plot.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], line_width=2)
show(plot)
这应该在本地创建一个名为test.html的文件,在浏览器中打开该文件,然后看到如下所示的结果:注意,我们仅用很少的几行代码就能创建图形。
5. Python Bokeh示例
既然我们已经验证了Bokeh的安装,现在就可以开始使用它的图形和绘图示例。
5.1)绘制简单的折线图
绘制简单的折线图与我们进行验证的过程非常相似,但是我们将添加一些细节以使该图易于阅读。
让我们看一下代码片段:
from bokeh.plotting import figure, output_file, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5]
# output to static HTML file
output_file("lines.html")
# create a new plot with a title and axis labels
p = figure(title="simple line example", x_axis_label='x', y_axis_label='y')
# add a line renderer with legend and line thickness
p.line(x, y, legend="Temp.", line_width=2)
# show the results
show(p)
让我们看一下该程序的输出:借助figure()函数及其参数,我们还能够为轴提供标题,从而更能说明我们在图上显示的数据以及图例。
。
5.2)多个图
我们知道如何创建一个简单的绘图,这次我们尝试创建多个绘图。
这是一个示例程序:
from bokeh.plotting import figure, output_file, show
# prepare some data
x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y0 = [i**2 for i in x]
y1 = [10**i for i in x]
y2 = [10**(i**2) for i in x]
# output to static HTML file
output_file("log_lines.html")
# create a new plot
p = figure(
tools="pan,box_zoom,reset,save",
y_axis_type="log", y_range=[0.001, 10**11], title="log axis example",
x_axis_label='sections', y_axis_label='particles'
)
# add some renderers
p.line(x, x, legend="y=x")
p.circle(x, x, legend="y=x", fill_color="white", size=8)
p.line(x, y0, legend="y=x^2", line_width=3)
p.line(x, y1, legend="y=10^x", line_color="red")
p.circle(x, y1, legend="y=10^x", fill_color="red", line_color="red", size=6)
p.line(x, y2, legend="y=10^x^2", line_color="orange", line_dash="4 4")
# show the results
show(p)
让我们看一下该程序的输出:这些图用图例和线条颜色定制得更多。
这样,更容易区分同一张图上的多个折线图。
5.3)矢量化的颜色和大小
当我们需要绘制大量数据时,不同的颜色和大小非常重要,因为我们需要可视化的东西很多,而很少显示。
这是一个示例程序:
import numpy as np
from bokeh.plotting import figure, output_file, show
# prepare some data
N = 4000
x = np.random.random(size=N) * 100
y = np.random.random(size=N) * 100
radii = np.random.random(size=N) * 1.5
colors = [
"#%02x%02x%02x" % (int(r), int(g), 150) for r, g in zip(50+2*x, 30+2*y)
]
# output to static HTML file (with CDN resources)
output_file("color_scatter.html", title="color_scatter.py example", mode="cdn")
TOOLS="crosshair,pan,wheel_zoom,box_zoom,reset,box_select,lasso_select"
# create a new plot with the tools above, and explicit ranges
p = figure(tools=TOOLS, x_range=(0,100), y_range=(0,100))
# add a circle renderer with vectorized colors and sizes
p.circle(x,y, radius=radii, fill_color=colors, fill_alpha=0.6, line_color=None)
# show the results
show(p)
让我们看一下该程序的输出:矢量化图在某些情况下非常重要,例如:
- 显示热图相关数据
- 显示具有某些参数的密度特性的数据
5.4)链接平移和刷
链接各个方面是用于数据可视化的非常有用的技术。
这是一个示例程序,如何使用Bokeh实现:
import numpy as np
from bokeh.layouts import gridplot
from bokeh.plotting import figure, output_file, show
# prepare some data
N = 100
x = np.linspace(0, 4*np.pi, N)
y0 = np.sin(x)
y1 = np.cos(x)
y2 = np.sin(x) + np.cos(x)
# output to static HTML file
output_file("linked_panning.html")
# create a new plot
s1 = figure(width=250, plot_height=250, title=None)
s1.circle(x, y0, size=10, color="navy", alpha=0.5)
# NEW: create a new plot and share both ranges
s2 = figure(width=250, height=250, x_range=s1.x_range, y_range=s1.y_range, title=None)
s2.triangle(x, y1, size=10, color="firebrick", alpha=0.5)
# NEW: create a new plot and share only one range
s3 = figure(width=250, height=250, x_range=s1.x_range, title=None)
s3.square(x, y2, size=10, color="olive", alpha=0.5)
# NEW: put the subplots in a gridplot
p = gridplot([[s1, s2, s3]], toolbar_location=None)
# show the results
show(p)
让我们看一下该程序的输出:当我们需要显示一个参数基于另一个参数的变化时,这种图特别有用。
5.5)日期时间轴
使用datetime进行绘图是非常常见的任务。
让我们尝试一个示例程序:
import numpy as np
from bokeh.plotting import figure, output_file, show
from bokeh.sampledata.stocks import AAPL
# prepare some data
aapl = np.array(AAPL['adj_close'])
aapl_dates = np.array(AAPL['date'], dtype=np.datetime64)
window_size = 30
window = np.ones(window_size)/float(window_size)
aapl_avg = np.convolve(aapl, window, 'same')
# output to static HTML file
output_file("stocks.html", title="stocks.py example")
# create a new plot with a a datetime axis type
p = figure(width=800, height=350, x_axis_type="datetime")
# add renderers
p.circle(aapl_dates, aapl, size=4, color='darkgrey', alpha=0.2, legend='close')
p.line(aapl_dates, aapl_avg, color='navy', legend='avg')
# NEW: customize by setting attributes
p.title.text = "AAPL One-Month Average"
p.legend.location = "top_left"
p.grid.grid_line_alpha=0
p.xaxis.axis_label = 'Date'
p.yaxis.axis_label = 'Price'
p.ygrid.band_fill_color="olive"
p.ygrid.band_fill_alpha = 0.1
# show the results
show(p)

