跳至主要内容

Bokeh 数据可视化教程:绘制数据结构

学习使用 Bokeh 对多种数据结构进行基础可视化。
· 6分钟 阅读

使用 AI 探索

在我们的第一篇 Bokeh 数据可视化教程中,您学习了如何从零开始使用图元构建可视化。现在,您可以扩展这一概念,从数组和数据框等不同的数据结构构建图表。在本教程中,您将学习如何使用 Bokeh 绘制 NumPy 数组、Pandas 数据框以及 ColumnDataSource 的数据。ColumnDataSource 是 Bokeh 的核心,使得在多个图表和小部件之间共享数据成为可能。

基于 NumPy 数组的 Bokeh 图表

使用 NumPy 数组创建折线图

# Import packages
import 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 packages
import 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)

会得到如下图表:

使用 Pandas 数据框创建图表

用 Pandas 数据框绘制折线

本示例中的数据来自 Kaggle。该数据集包含截至 2018 年 12 月的 5 年间,标普 500 指数中所有股票的信息。文件包含七列:

  • Date - 日期,格式为 yy-mm-dd
  • Open - 当日开盘价
  • High - 当日最高价
  • Low - 当日最低价
  • Close - 当日收盘价
  • Volume - 当日成交量
  • Name - 股票代码

我们想查看 Google 股票在这五年间的趋势。首先使用 Pandas 加载数据,然后查看数据框的前五行。

# Import packages
import 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 packages
import 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)

圆点表示 Apple 与 Google 最高价之间的对应关系。总体来看,Google 与 Apple 的股价呈正相关。

基于 ColumnDataSource 创建 Bokeh 图表

ColumnDataSource 的目的,是让您能够用同一份数据创建不同的图表。简而言之,它为多个图表和分析提供可复用的数据基础。这将为您节省时间,因为您无需在 Jupyter Notebook 中多次加载数据。

ColumnDataSource 类似于 Python 字典,其中每一列的数据都以该列名的字符串作为键。

使用 ColumnDataSource 创建折线图

# Import packages
from 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 在 5 年期间的最高价走势,折线标示了每个价格点。

为了创建此图,我们将完整的 Google 股票数据框传入 ColumnDataSource 函数,并将其保存为名为 data 的变量。

随后,我们通过 source 参数将这份数据传入绘图函数。这样在创建图表时即可直接使用列名,而无需反复调用数据框。

最后,我们使用 line 函数绘制绿色折线来表示数据点。

使用 ColumnDataSource 创建散点图

在这段代码中,我们将完整的 Google 股票数据框传入 ColumnDataSource(与折线图示例相同)。该数据框作为名为 data 的变量保存到 ColumnDataSource 中。我们首先通过直接调用列名创建折线图,最后使用 diamond 函数绘制红色菱形来表示单个数据点。

# Import packages
from 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)

该图展示了 Google 股票在 5 年期间的演变,红色菱形标示了每个价格点。

结论

本教程介绍了您在 Python 中最常会遇到的数据结构,以及如何使用它们让数据“动起来”。虽然 Bokeh 并非 Python 可视化的唯一选择,但与 Matplotlib 或 Seaborn 相比,它以易用性和交互能力见长。在下一篇教程中,您将通过实践学习如何使用布局来创建高效且交互性强的可视化。如果您想深入了解 Bokeh 提供的全部数据可视化可能性,欢迎查看 DataCamp 的 Interactive Data Visualization with Bokeh 课程。

主题