关注matplotlib和以它为基础的库
seaborn底层绘图
在Jupyter notebook中使用交互式绘图,执行以下语句
%matplotlib notebook
9.1 简明matplotlib API入门
-
导入
import matplotlib.pyplot as plt
-
matplotlib的可视化作品库和文档是学习高级功能的最佳资源
图片与子图
-
绘制的图位于图片(Figure)对象中,plt.figure生成一个新的图片
fig = plt.figure()
-
add_subplot创建一个或多个子图(subplot),返回Axes Subplot对象;可以使用这些对象进行画图
# 图片摆放是2*2的,这是选择四个图形中的第一个 ax1 = fig.add_subplot(2, 2, 1) # 使用对象画图 _ = ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
-
复杂的图表操作放在单个的notebook单元格中,因为每个单元格运行后,图表被重置
-
使用子网格图创建图片:plt.subplots
-
返回包含子图对象的NumPy数组
fig, axes = plt.subplots(2, 3) axes """ array([[<AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>], [<AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>]], dtype=object) """
-
数组axes可以像二维数组一样方便地进行索引,axes[0,1]
-
pyplot.subplots选项
-
调整子图周围的间距
-
使用图对象上的subplots_adjust方法更改间距,也可以用作顶层函数
# wspace控制图片宽度比 # hspace控制图片高度比 subplots_adjust(left=None, bottom=None, right=None,top=None, wspace=None, hspace=None)
颜色、标记和线类型
-
matplotlib的主函数plot接收带有x和y轴的数组以及一些可选的字符串缩写参数来指明颜色和线类型,也可用十六进制颜色代码来指定颜色
# 使用绿色破折号绘制x对y的线 ax.plot(x, y, linestyle='--', color='g') # 简化版 ax.plot(x, y, 'g--')
-
折线图用标记凸显实际数据点
-
标记可以是样式字符串的一部分
-
线类型、标记类型必须跟在颜色后面
-
折线图举例
from numpy.random import randn plt.plot(randn(30).cumsum(), 'ko--') # 分开写 # plot(randn(30).cumsum(), color='k',linestyle='dashed', marker='o')
-
使用drawstyle改变内插新式
plt.plot(data, 'k-', drawstyle='steps-post',label='steps-post') plt.legend(loc='best')
-
-
使用plt.legend为每条线生成一个用于区分的图例
无论你在用数据绘图时是否传递了lebel选项,你都必须调用plt.legend (如果你有轴的引用,也可以用ax.legend)来生成图例
刻度、标签和图例
-
两种修饰图表的方式
-
程序性的matplotlib.pyplot接口
-
包含了像xlim(绘图范围)、xticks(刻度位置)和xticklabels(刻度标签)等
-
使用方法
- 没有函数参数调用:返回当前的参数值(例如plt.xlim()返回当前的x轴绘图范围)
- 传入函数参数调用,并设置参数值:(例如plt.xlim([0, 10])会将x轴的范围设置为0到10)
会在最近的AxesSubplot上生效
xlim对应子图自身两个方法:ax.get_lim和ax.set_lim
可以更显式地使用subplot子图方法
-
-
面向对象的原生matplotlib API
-
设置标题、轴标签、刻度和刻度标签
-
改变轴刻度
-
set_xticks:在数据范围内设定刻度的位置,默认刻度有标签
ticks = ax.set_xticks([0, 250, 500, 750, 1000])
-
set_xticklabels:为标签赋值
labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],rotation=30, fontsize='small') # rotation将x轴的刻度标签旋转30度
-
-
设置轴名称:
set_xlabel()
-
设置子图标题:
set_title()
-
批量设置绘图属性
props = { 'title':'my first matplotlib plot' 'xlabel':'Stages' } ax.set(**props)
添加图例
-
添加每个图表时传递label参数
from numpy.random import randn fig = plt.figure(); ax = fig.add_subplot(1, 1, 1) ax.plot(randn(1000).cumsum(), 'k', label='one') ax.plot(randn(1000).cumsum(), 'k--', label='two') ax.plot(randn(1000).cumsum(), 'k.', label='three') # 调用ax.legend()或plt.legend自动生成图例 # loc参数告诉matplotlib在哪里放置图表 ax.legend(loc='best')
-
取消图例:不要传入label参数或者传入
label='_nolegend_'
注释与子图加工
-
使用text、arrow和annote方法来添加注释和文本
# 在给定坐标(x,y)上绘制文本 ax.text(x, y, 'Hello world!',family='monospace', fontsize=10)
-
ax.annotate方法可以在指定的x和y坐标上绘制标签
-
matplotlib的图形全集位于matplotlib.patches,但是一些常见图形可在matplotlib.pyplot中找到。
-
在图表中添加图形
-
生成patch(补丁)对象shp
-
调用
ax.add_patch (shp)
将它加入到子图中 -
示例代码
fig = plt.figure(figsize=(12, 6)); ax = fig.add_subplot(1, 1, 1) rect = plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3) circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3) pgon = plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]], color='g', alpha=0.5) ax.add_patch(rect) ax.add_patch(circ) ax.add_patch(pgon)
-
结果展示
-
将图片保存到文件
-
使用plt.savefig将图片保存到文件,文件类型根据扩展名推断
-
.pdf:PDF文件
-
.dpi:控制每英寸点数的分辨率
-
bbox_inches:修剪实际图形的空白
# PNG图片,拥有最小的空白 plt.savefig('figpath.png', dpi=400, bbox_inches='tight')
-
figure.savefig选项
-
-
savefig可以写到所有文件对象中,如BytesIO()
from io import BytesIO buffer = BytesIO() plt.savefig(buffer) plot_data = buffer.getvalue()
matplotlib设置
matplotlib中的配色方案和默认设置可以通过广泛的全局参数来定制
-
使用rc方法修改Python编程配置
-
第一个参数为想要自定义的组件,比如’figure’、‘axes’、‘xtick’、‘ytick’、‘grid’、'legend’等等。
plt.rc('figure', figsize=(10, 10))
-
使用字典按照关键字参数的序列指定新参数
font_options = {'family' : 'monospace', 'weight' : 'bold', 'size' : 'small'} plt.rc('font', **font_options)
-
-
更深入的定制和参看全量选项
- 参考matplotlib的设置文件matplotlibrc,该文件位于matplotlib/mpl-data路径
- 定制文件后放在home路径下并且将文件命名为.matplotlibrc,则每次你使用matplotlib时都会读取该文件。
9.2 使用pandas和seaborn绘图
seaborn简化了常用可视化类型,会修改默认的matplotlib配色方案和绘图样式,提高可读性和美观性
折线图
-
Series和DataFrame都有一个plot属性,用于绘制基本图形,默认是折线图
- Series的索引会作为x轴,可以传入
use_index=False
来禁用这个功能 - DataFrame的plot方法在同一个子图中将每一列绘制为不同的折线,并自动生成图例
- plot属性包含了不同绘图类型的方法族。例如,
df.plot()
等价于df.plot.line()
- Series的索引会作为x轴,可以传入
-
Series.plot方法参数
-
DataFrame的plot参数
柱状图
-
plot.bar():垂直柱状图;plot.barh():水平柱状图
-
Series或DataFrame的索引将会被用作x轴刻度(bar)或y轴刻度(barh)
-
示例
fig, axes = plt.subplots(2, 1) data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop')) data.plot.bar(ax=axes[0], color='k', alpha=0.7) data.plot.barh(ax=axes[1], color='k', alpha=0.7)
-
-
在DataFrame中,柱状图将每一行中的值分组到并排的柱子中的一组
-
堆积柱状图:传递
stacked=True
使用value_counts: s.value_counts().plot.bar()可以有效地对Series值频率进行可视化
-
使用seaborn绘制需要聚合和汇总的数据会更简单:seaborn.barplot
- data参数:可以是pandas的DataFrame
- hue参数:通过一个额外的分类值将数据分离
-
设置seaborn外观:
sns.set(style="whitegrid")
直方图和密度图
直方图
- 定义:直方图是一种条形图,用于给出值频率的离散显示。数据点被分成离散的,均匀间隔的箱,并且绘制每个箱中数据点的数量。
- 使用Series的plot.hist方法可以绘制直方图
密度图
-
定义:通过计算可能产生观测数据的连续概率分布估计而产生,密度图也被称为内核密度估计图(KDE)。
-
plot.kde使用传统法定混合法估计绘制密度图
-
distplot方法可以绘制直方图和连续密度估计
import seaborn as sns comp1 = np.random.normal(0, 1, size=200) comp2 = np.random.normal(10, 2, size=200) values = pd.Series(np.concatenate([comp1, comp2])) sns.distplot(values, bins=100, color='k')
散点图或点图
点图或散点图可以用于检验两个一维数据序列之间的关系
-
seaborn的regplot方法 绘制散点图并拟合一条线性回归线
-
seaborn的pairplot方法:支持在对角线上放置每个变量的直方图和密度估计值
# plot_kws参数能够将配置选项传递给非对角元素上的各个绘图调用 sns.pairplot(trans_data, diag_kind='kde', plot_kws={'alpha': 0.2})
分面网格和分类数据
使用分面网格是利用多种分组变量对数据进行可视化的方式
-
sns.factorplot():可以简化多种分面绘图
sns.factorplot(x='day', y='tip_pct', hue='time', col='smoker',kind='bar', data=tips[tips.tip_pct < 1])
-
可以使用seaborn.FaceGrid创建自己的分面网格图
9.3 其他Python可视化工具
- 创建web交互式
- Bokeh(http://bokeh.pydata.org/)
- Plotly(https://github.com/plotly/plotly.py)
- 印刷或静态网页
- matplotlib
- pandas
- seaborn