# Import packagesimport numpy as np
import random
from bokeh.io import output_file, show
from bokeh.plotting import figure
# Create an array
x_array = np.array([10,20,30,40,50,60])
y_array = np.array([50,60,70,80,90,100])# Create a line plot
plot = figure()
plot.line(x_array, y_array)# Output plot
show(plot)技术支持
使用 NumPy 数组创建散点图
# Import packagesimport numpy as np
import random
from bokeh.io import output_file, show
from bokeh.plotting import figure
# Create arrays
x_arr = np.array([10,11,12,13,14,15,16])
y_arr = np.array([17,18,19,20,21,22,23])# Create plot
plot = figure(title ="Scatter plot", x_axis_label ="Label name of x axis", y_axis_label ="Label name of y axis")
plot.circle(x_arr,y_arr, size =30, alpha =0.5)# show plot
show(plot)技术支持
我们想查看 Google 股票在这五年间的趋势。首先使用 Pandas 加载数据,然后查看数据框的前五行。
# Import packagesimport pandas as pd
# Load data
df = pd.read_csv('all_stocks_5yr.csv')
df.head()技术支持
# Focus on Google's stock
df_goog = df[df['Name']=='GOOG']# Convert date column to a time series
df_goog['date']= pd.to_datetime(df_goog['date'])
plot = figure(title="Pandas Line Plot", x_axis_type ='datetime', x_axis_label ='date', y_axis_label='Prices')
plot.line(x = df_goog['date'], y = df_goog['high'])# Output plot
show(plot)技术支持
在该图表中,需要将日期列转换为 datetime 类型,才能在 x 轴上正确显示日期。此外,使用 line 函数(Bokeh 中的图元)来生成 Google 最高价的时间序列图。
从 Pandas 数据框创建散点图
本节继续使用 Kaggle 提供的开源标普 500 股价数据。在这个示例中,我们希望查看 Google 股价与 Apple 股价之间的相关性。您可以在这里了解更多关于相关性的知识。
# Import required packages# Import packagesimport pandas as pd
from bokeh.io import output_file, show
from bokeh.plotting import figure
# Load data
df = pd.read_csv('all_stocks_5yr.csv')# Select Google and Apple stock
df_goog = df[df['Name']=='GOOG']
df_apple = df[df['Name']=='AAPL']# Select only 'date' and 'high' columns for Google and Apple
df_goog = df_goog[['date','high']]
df_apple = df_apple[['date','high']]# Rename 'high' column to 'high_goog' and 'high_apple'
df_goog.rename(columns={'high':'high_goog'}, inplace=True)
df_apple.rename(columns={'high':'high_apple'}, inplace=True)
df_merged = pd.merge(df_goog, df_apple, how='inner', on='date')# See the first five rows
df_merged.head(5)技术支持
合并确保按日期对齐每日价格。这样可以避免将不同日期的价格进行相关分析,从而导致错误的统计推断。
# Create scatter plot
plot = figure(title="Pandas Scatter Plot", x_axis_label ="Apple high prices", y_axis_label="Google high prices")
plot.circle(x = df_merged['high_apple'], y = df_merged['high_goog'],color ='red', size =10, alpha =0.8)# Output the plot
show(plot)技术支持
# Import packagesfrom bokeh.io import output_file, show
from bokeh.plotting import figure, ColumnDataSource
# Create the ColumnDataSource object
df_goog['date']= pd.to_datetime(df_goog['date'])
data = ColumnDataSource(df_goog)# Create time series plot
plot = figure(x_axis_type='datetime',
title='GOOG high prices ts plot',
x_axis_label ="Date",
y_axis_label ="Prices in $")
plot.line(x='date', y ='high_goog', source = data, color ='green')
show(plot)技术支持
在这段代码中,我们将完整的 Google 股票数据框传入 ColumnDataSource(与折线图示例相同)。该数据框作为名为 data 的变量保存到 ColumnDataSource 中。我们首先通过直接调用列名创建折线图,最后使用 diamond 函数绘制红色菱形来表示单个数据点。
# Import packagesfrom bokeh.io import output_file, show
from bokeh.plotting import figure, ColumnDataSource
# Create the ColumnDataSource object
df_goog['date']= pd.to_datetime(df_goog['date'])
data = ColumnDataSource(df_goog)# Create time series plot
plot = figure(x_axis_type='datetime',
title='GOOG high prices ts plot',
x_axis_label ="Date",
y_axis_label ="Prices in $")
plot.line(x='date', y ='high_goog', source = data, color ='green')
plot.diamond(x='date', y ='high_goog', source = data, color ='red')
show(plot)技术支持
在我们的第一篇 Bokeh 数据可视化教程中,您学习了如何从零开始使用图元构建可视化。现在,您可以扩展这一概念,从数组和数据框等不同的数据结构构建图表。在本教程中,您将学习如何使用 Bokeh 绘制 NumPy 数组、Pandas 数据框以及 ColumnDataSource 的数据。ColumnDataSource 是 Bokeh 的核心,使得在多个图表和小部件之间共享数据成为可能。
基于 NumPy 数组的 Bokeh 图表
使用 NumPy 数组创建折线图
使用 NumPy 数组创建散点图
会得到如下图表:
使用 Pandas 数据框创建图表
用 Pandas 数据框绘制折线
本示例中的数据来自 Kaggle。该数据集包含截至 2018 年 12 月的 5 年间,标普 500 指数中所有股票的信息。文件包含七列:
我们想查看 Google 股票在这五年间的趋势。首先使用 Pandas 加载数据,然后查看数据框的前五行。
在该图表中,需要将日期列转换为 datetime 类型,才能在 x 轴上正确显示日期。此外,使用 line 函数(Bokeh 中的图元)来生成 Google 最高价的时间序列图。
从 Pandas 数据框创建散点图
本节继续使用 Kaggle 提供的开源标普 500 股价数据。在这个示例中,我们希望查看 Google 股价与 Apple 股价之间的相关性。您可以在这里了解更多关于相关性的知识。
合并确保按日期对齐每日价格。这样可以避免将不同日期的价格进行相关分析,从而导致错误的统计推断。
圆点表示 Apple 与 Google 最高价之间的对应关系。总体来看,Google 与 Apple 的股价呈正相关。
基于 ColumnDataSource 创建 Bokeh 图表
ColumnDataSource 的目的,是让您能够用同一份数据创建不同的图表。简而言之,它为多个图表和分析提供可复用的数据基础。这将为您节省时间,因为您无需在 Jupyter Notebook 中多次加载数据。
ColumnDataSource 类似于 Python 字典,其中每一列的数据都以该列名的字符串作为键。
使用 ColumnDataSource 创建折线图
该图展示了 Google 在 5 年期间的最高价走势,折线标示了每个价格点。
为了创建此图,我们将完整的 Google 股票数据框传入 ColumnDataSource 函数,并将其保存为名为 data 的变量。
随后,我们通过 source 参数将这份数据传入绘图函数。这样在创建图表时即可直接使用列名,而无需反复调用数据框。
最后,我们使用 line 函数绘制绿色折线来表示数据点。
使用 ColumnDataSource 创建散点图
在这段代码中,我们将完整的 Google 股票数据框传入 ColumnDataSource(与折线图示例相同)。该数据框作为名为 data 的变量保存到 ColumnDataSource 中。我们首先通过直接调用列名创建折线图,最后使用 diamond 函数绘制红色菱形来表示单个数据点。
该图展示了 Google 股票在 5 年期间的演变,红色菱形标示了每个价格点。
结论
本教程介绍了您在 Python 中最常会遇到的数据结构,以及如何使用它们让数据“动起来”。虽然 Bokeh 并非 Python 可视化的唯一选择,但与 Matplotlib 或 Seaborn 相比,它以易用性和交互能力见长。在下一篇教程中,您将通过实践学习如何使用布局来创建高效且交互性强的可视化。如果您想深入了解 Bokeh 提供的全部数据可视化可能性,欢迎查看 DataCamp 的 Interactive Data Visualization with Bokeh 课程。