# 沿用70多年的经典数据可视化方法，如何用Python实现？

01 概述

▲时间序列

1. 趋势性：某个变量随着时间进展或自变量变化，呈现出一种比较缓慢而长期的持续上升、下降、停留的同性质变动趋向，但变动幅度可能不相等。
2. 周期性：某因素由于外部影响随着自然季节的交替出现高峰与低谷的规律。
3. 随机性：个别为随机变动，整体呈统计规律。
4. 综合性：实际变化情况是几种变动的叠加或组合。预测时设法过滤除去不规则变动，突出反映趋势性和周期性变动。

02 实例

• 代码示例①
```from bokeh.sampledata.stocks import AAPL
import numpy as np
# 数据
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')
# 画布
p = figure(width=800, height=350, x_axis_type="datetime")
# 图层
p.circle(aapl_dates, aapl, size=4, color='darkgrey', alpha=0.2, legend='close')
p.line(aapl_dates, aapl_avg, color='red', legend='avg')
# 自定义属性
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="gray"
p.ygrid.band_fill_alpha = 0.1
p.legend.click_policy="hide" # 点击图例显示隐藏数据
# 显示结果
show(p)  ```

▲图1 代码示例①运行结果

• 代码示例②
```import numpy as np
from bokeh.models import ColumnDataSource, CustomJSTransform
from bokeh.plotting import figure
from bokeh.io import output_file, show
from bokeh.sampledata.stocks import AAPL, GOOG
from bokeh.transform import transform
# 数据转换为时间类型
def datetime(x):
return np.array(x, dtype=np.datetime64)
# 画布
plot = figure(x_axis_type="datetime", title="Normalized Stock Closing Prices",
plot_width=800, plot_height=350)
# 其他
plot.background_fill_color = "#f0f0f0"
plot.xgrid.grid_line_color = None
plot.ygrid.grid_line_color = "black"
plot.ygrid.grid_line_alpha = 0.1
plot.xaxis.axis_label = 'Date'
plot.yaxis.axis_label = 'Normalized Price'
# 数据
aapl_source = ColumnDataSource(data=dict(
aapl_date=datetime(AAPL['date']),
))

goog_source = ColumnDataSource(data=dict(
goog_date=datetime(GOOG['date']),
))
# CustomJSTransform
v_func = """
const first = xs[0]
const norm = new Float64Array(xs.length)
for (let i = 0; i < xs.length; i++) {
norm[i] = xs[i] / first
}
return norm
"""
normalize = CustomJSTransform(v_func=v_func)
# 绘图
plot.line(x='aapl_date', y=transform('aapl_close', normalize), line_width=2,
color='#cf3c4d', alpha=0.6,legend="Apple", source=aapl_source)
plot.line(x='goog_date', y=transform('goog_close', normalize), line_width=2,
plot.legend.location='top_left'
# 显示
show(plot)  ```

▲图3 代码示例②运行结果

• 代码示例③
```from bokeh.models import BoxAnnotation
from bokeh.sampledata.glucose import data as data_or
import numpy as np
# 工具条
TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
# 数据
data = data_or.sort_index()['2010-03-24':'2010-03-25']
# 画布
p = figure(x_axis_type="datetime", tools=TOOLS, title="Glocose Readings, Oct 4th (Red = Outside Range)")
10.
# 绘图
p.line(np.array(data.index.tolist(), dtype=np.datetime64), data.glucose.values, line_color='gray')
p.circle(data.index, data.glucose, color='grey', size=1)
# 箱形标记
# 其他
p.background_fill_color = "#efefef"
p.xgrid.grid_line_color=None
p.xaxis.axis_label = 'Time'
p.yaxis.axis_label = 'Value'
show(p)  ```

▲图3 代码示例③运行结果

• 代码示例④
```import numpy as np
from bokeh.layouts import gridplot
from bokeh.sampledata.stocks import AAPL, GOOG, IBM, MSFT
def datetime(x):
return np.array(x, dtype=np.datetime64)
# 画布1
p1 = figure(x_axis_type="datetime", title="Stock Closing Prices")
p1.grid.grid_line_alpha=0.3
p1.xaxis.axis_label = 'Date'
p1.yaxis.axis_label = 'Price'
# 绘图1
p1.legend.location = "top_left"
# 数据2
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')
# 画布2
p2 = figure(x_axis_type="datetime", title="AAPL One-Month Average")
p2.grid.grid_line_alpha = 0
p2.xaxis.axis_label = 'Date'
p2.yaxis.axis_label = 'Price'
p2.ygrid.band_fill_color = "olive"
p2.ygrid.band_fill_alpha = 0.1
p2.circle(aapl_dates, aapl, size=4, legend='close',
color='darkgrey', alpha=0.2)
p2.line(aapl_dates, aapl_avg, legend='avg', color='navy')
p2.legend.location = "top_left"
# 显示
show(gridplot([[p1,p2]],plot_width=400, plot_height=400))```

▲图4 代码示例④运行结果

• 代码示例⑤
```from numpy import pi, exp, linspace, sin
import time
from bokeh.util.browser import view
from bokeh.document import Document
from bokeh.embed import file_html
from bokeh.models.glyphs import Circle
from bokeh.models import Plot, DatetimeAxis, ColumnDataSource, PanTool, WheelZoomTool
from bokeh.resources import INLINE
# 数据
N = 200
x = linspace(-2 * pi, 2 * pi, N)
y = sin(x)*exp(-x)
# 创建一组时间数据，以当前时间往后延伸24小时
times = (linspace(0, 24*3600, N) + time.time()) * 1000
source = ColumnDataSource(data=dict(x=x, y=y, times=times))
# 画布
plot = Plot(min_border=80, plot_width=800, plot_height=350, background_fill_color="#efefef")
# 绘图
circle = Circle(x="times", y="y", fill_color="red", size=3, line_color=None, fill_alpha=0.5)
# 设置时间轴
# 设置工具条
# 显示
show(plot)  ```

▲图5 代码示例⑤运行结果

0 条评论

• ### 别人家的AI忙着探索未来，他们已经用AI在解决历史难题

今年4月，英特尔公司与中国文物保护基金会建立合作，宣布采用人工智能技术以及无人机技术实施对于箭扣长城的修缮和保护。

• ### 阿里智能餐厅落地！刷脸就吃，擦嘴就走！

这两天，马云爸爸又出尽了风头。租房免押金、宣布成立达摩院、计划三年内向基础科学研发投资超过 1000 亿元……

• ### 什么是折线图？怎样用Python绘制？怎么用？终于有人讲明白了

导读：数据分析时经常用到的折线图，你真的懂了吗？可以用来呈现哪些数据关系？在数据分析过程中可以解决哪些问题？怎样用Python绘制折线图？本文逐一为你解答。

• ### leetcode 860 —柠檬水找零（简单题）

每位顾客只买一杯柠檬水，然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零，也就是说净交易是每位顾客向你支付 5 美元。

• ### 春节充电系列：李宏毅2017机器学习课程学习笔记24之结构化学习-Structured SVM（part 2）

【导读】我们在上一节的内容中已经为大家介绍了台大李宏毅老师的机器学习课程的Structured learning-Structured SVM（part 2），...

• ### 什么是单点登录？单点登录的三种实现方式

单点登录SSO（Single Sign On）说得简单点就是在一个多系统共存的环境下，用户在一处登录后，就不用在其他系统中登录，也就是用户的一次登录能得到其他所...

• ### 用上索引就一定比全表扫描快？

在外 5 分钟，全身都能湿透的季节终于还是到来了。作为行政的小C，原本在空调下吹着风，贴着各处提交来的发票，倒也不算太糟糕。

• ### SpringBoot当中如何整合静态html（模拟SpringMVC）

整合静态html（模拟SpringMVC）： 1）在上一个项目中，在src/main目录下，添加resources/static/index.html：（参考目...

• ### 时间序列分析这件小事（二）--自回归

说到时间序列，那么就必须提起自回归了。什么是自回归呢，就是说未来的一个时点可以用之前的时点来进行回归预测，还是那一串数字，但是时间状态不同了，存在不同阶的时滞。