数据可视化是描述性统计不可或缺的亮点,在matplotlib、JavaScript(D3.js)、OpenGL的基础上百花齐放,百家争鸣
以最小的复杂度展示足够多的信息
美国教育家、设计师Robin Williams《The Non-Designer's Design Book(写给大家看的设计书)》
随着HTML5、SVG/Canvas普及,尤其是Mike Bostock于2010开源D3.js,python数据可视化受到冲击,Facebook于2013发布react.js后,Python数据可视化开始向web组件化发展,重点方向是机器学习与Web交互
首发年份 | 名称 | 简介 |
---|---|---|
2003 | matplotlib | 基础绘图工具 |
2010 | networkx | 复杂网络与图算法工具 |
2012 | seaborn | 快速统计图 |
2012 | bokeh | 交互式 |
2012 | plotly | 交互式 |
2015 | altair | 声明式语义 |
2015 | dash | 基于plotly的web app |
2015 | tensorboard | tensorflow and keras |
2017 | ipyvolume | 3D交互 |
2018 | Vaex | 高性能渲染 |
2018 | streamlit | 机器学习web app |
2018 | volia | notebook web app |
pyviz网站整理了Python数据可视化工具
Matplotlib的设计哲学是让Python程序员完全控制可视化应用。Matplotlib中文字体显示问题,请参考中文设置方法
%load_ext autoreload
%autoreload 2
%matplotlib inline
from matplotlib.font_manager import _rebuild
_rebuild()
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("whitegrid", {"font.sans-serif": ["SimHei", "Arial"]})
import pandas_alive
import pandas as pd
import numpy as np
df_covid = pd.read_json("3.data-viz/timeseries.json")
df_covid.index = pd.DatetimeIndex(df_covid.iloc[:, 0].apply(lambda _: _["date"]))
df_covid.index.name = "日期"
df_covid = df_covid.applymap(lambda _: int(_["confirmed"]))
df_covid.replace(0, np.nan, inplace=True)
top20 = df_covid.iloc[-1].sort_values().tail(20).index
df_covid = df_covid[top20]
%matplotlib notebook
会在Notebook中启动交互式图形%matplotlib inline
会在Notebook中启动静态图形ipython
后使用%matplotlib
魔法命令,每个plt命令都会自动打开一个图形窗口%matplotlib notebook
x = np.linspace(0, 10, 100)
fig = plt.figure()
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
plt.title('测试')
# plt.show()`会启动一个事件循环(event loop)
plt.show()
%matplotlib inline
x = np.linspace(0, 10, 100)
fig = plt.figure()
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
plt.title('测试')
# plt.show()`会启动一个事件循环(event loop)
plt.show()
# 保存图形
fig.savefig('sin_cos.png')
ls -lh sin_cos.png
-rw-r--r-- 1 toddtao staff 23K May 28 16:13 sin_cos.png
# 用IPython的`Image`对象显示图形
from IPython.display import Image
Image('sin_cos.png')
用markdown语法显示图形
plt
)接口绘图,与MATLAB语法类似,plt是有状态的(stateful),会持续跟踪“当前的”图形和坐标轴,控制子图时比较麻烦Figure
和Axes
方法控制图形,可以按照行列控制子图,操作非常灵活plt.Figure
类的一个实例,是一个能够容纳各种坐标轴、图形、文字和标签的容器plt.Axes
类的一个实例,是一个带有刻度和标签的矩形,包含所有可视化的图形元素plt.figure() # 创建图形
# 创建两个子图中的第一个,设置坐标轴
plt.subplot(2, 1, 1) # (行、列、子图编号)
plt.plot(x, np.sin(x))
# 创建两个子图中的第二个,设置坐标轴
plt.subplot(2, 1, 2)
plt.plot(x, np.cos(x));
# 先创建图形网格
# ax是一个包含两个Axes对象的数组
fig, ax = plt.subplots(2)
# 在每个对象上调用`plot()`方法
ax[0].plot(x, np.sin(x))
ax[1].plot(x, np.cos(x));
plt.plot()
函数设置颜色(color
参数)与风格(linestyle
参数)
plt.figure(figsize=(10, 5))
plt.plot(x, np.sin(x - 0), color='blue') # 标准颜色名称
plt.plot(x, np.sin(x - 1), color='g') # 缩写颜色代码(rgbcmyk)
plt.plot(x, np.sin(x - 2), color='0.75') # 范围在0~1之间的灰度值
plt.plot(x, np.sin(x - 3), color='#FFDD44') # 十六进制(RRGGBB,00~FF)
plt.show()
plt.figure(figsize=(10, 5))
plt.plot(x, np.sin(x - 0), linestyle='-') # 实线
plt.plot(x, np.sin(x - 1), linestyle='--') # 虚线
plt.plot(x, np.sin(x - 2), linestyle='-.') # 点划线
plt.plot(x, np.sin(x - 3), linestyle=':'); # 实点线
plt.show()
可以将linestyle
和color
编码组合起来,作为plt.plot()
函数的一个参数使用:
plt.figure(figsize=(10, 5))
plt.plot(x, np.sin(x - 0), '-g') # 绿色实线
plt.plot(x, np.sin(x - 1), '--c') # 青色虚线
plt.plot(x, np.sin(x - 2), '-.k') # 黑色点划线
plt.plot(x, np.sin(x - 3), ':r'); # 红色实点线