Pandas 的绘图函数
之前看的直接用 matplotlib 来绘图, 画一张图还得配置各种标题, 刻度标签等等. 而 pandas 的 DataFrame 和 Series 都自带生成各类图表的 plot 方法, 就可以省略去写行列标签, 分组信息等. 明显更简洁的多.
线形图
plot 方法默认生成的就是线形图.
- import numpy as np
- from pandas import Series,DataFrame
%matplotlib inline
s = Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
s.plot()
该 Series 对象的索引会传给 matplotlib, 并用来绘制 X 轴. 可以用 use_index=False, 然后用 xticks 和 xlim,yticks 和 ylim 调节. 其他参数参考后面的 plot 的参数表查看.
DataFrame 的 plot 方法会在一个 subplot 中为各列绘制一条线, 并自动创建图例.
df = DataFrame(np.random.randn(10,4).cumsum(0),columns = ['A','B','C','D' ],index = np.arange(0,100,10))
df.plot()
Series.plot 方法的参数如下:
参数 | 说明 |
---|---|
label | 用于图例的标签 |
ax | 要在其上进行绘制的 matplotlib subplot 对象. 如果没有设置,则使用当前 matplotlib subplot |
style | 将要传给 matplotlib 的风格字符串 (如'ko--') |
alpha | 图表的填充不透明度 (0 到 1 之间) |
kind | 可以是'line', 'bar', 'barh', 'kde |
logy | 在 y 轴上使用对数标尺 |
use index | 将对象的索引用作刻度标签 |
rot | 旋转刻度标签 (0 到 360) |
xticks | 用作 x 轴刻度的值 |
yticks | 用作 y 轴刻度的值 |
xlim | x 轴的界限 (例如 [0,101) |
ylim | y 轴的界限 |
grid | 显示轴网格线 (默认打开) |
专用于 DataFrame.plot 方法的参数如下:
参数 | 说明 |
---|---|
subplots | 将各个 DataFrame 列绘制到单独的 subplot 中 |
sharex | 如果 subplots=True,则共用同一个 x 轴,包括刻度和界限 |
sharey | 如果 subplots=True,则共用同一个 Y 轴 |
figsize | 表示图像大小的元组 |
title | 表示图像标题的字符串 |
legend | 添加一个 subplot 图例 (默认为 True) |
sort_columns | 以字母表顺序绘制各列,默认使用当前列顺序 |
柱状图
柱状图比较简单, 在线形图生成的代码下, 添加 kind='bar'(垂直柱状图)或 kind='barh'(水平柱状图)
DataFrame 默认会将每行的数据分为一组.
kind 参数
当使用 stacked = True 参数时即可生成堆积柱状图, 每行的值堆积在一起.
stacked 参数
s.value_counts().plot(kind='bar')
可用来显示 Series 各值的出现概率.
后面举了个例子不贴了, 但是这个注解...
直方图和密度图
直方图 (histogram) 是一种可以对值频率进行离散化显示的柱状图. 数据点被拆分到离散的, 间隔均匀的面元中. 绘制的是各面元中数据点的数量. 简而言之, 就是用来表明分布情况的柱状图. 一般第一步是将值的范围分段, 即将整个值的范围分成一系列间隔, 然后计算每个间隔中有多少值. 这些值通常被指定为连续的, 不重叠的变量间隔. 间隔必须相邻, 并且通常是 (但不是必须的) 相等的大小. Serises 的 hist 方法可以实现.
与此相关的一种图表类型是密度图, 它是通过计算 "可能会产生观测数据的连续概率分布的估计" 而产生的. 一般的过程是将该分布近似为一组核 (即诸如正态(高斯) 分布之类的较为简单的分布). 因此, 密度图也被称作 KDE (Kernel Density Estimate, 核密度估计)图. 调用 plot 时加 kind='kde'即可生成一张密度图(标准混合正态分布).
这两种图表常常会被画在一起. 直方图以规格化形式给出(以便给出面元化密度). 然后再在其上绘制核密度估计. 看一个由两个不同的标准正态分布组成的双峰分布(如图所示):
- comp1 = np.random.normal(0,1,size=200) #N(0,1)
- comp2 = np.random.normal(10,2,size=200) #N(10,4)
- values = Series(np.concatenate([comp1,comp2]))
- values.hist(bins=100,alpha=0.3,color='k',normed =True) #hist 画直方图
- values.plot(kind='kde',style='k--')
两个不同的标准正态分布组成的双峰分布
散布图
散布图 (scatter plot) 是观察两个一维数据序列之间的关系的有效手段. matplotlib 的 scatter 方法是绘制散布图的主要方法.
DataFrame 用 plotting 的 scatter_matrix 创建散布图矩阵, 并且支持对角线上放置各变量的直方图或密度图(diagonal='kde').
import pandas as pd
pd.plotting.scatter_matrix(df,diagonal='kde',color='k',alpha=0.3)
散布图
Python 图形化工具生态系统
matplotlib 是 Python 领域使用最广泛的绘图工具. 虽然 matplotlib 可以为
web 应用创建漂亮的图表, 但这通常需要耗费大量的精力, 因为它原本是为印刷而设计的. 先不管美不美观, 至少它足以应付大部分需求. 其他的还有 Chaco(非常适合用复杂的图形化方式表达数据的内部关系. 对交互的支持要好得多, 而且渲染速度很快),mayavi(是一个基于开源 C++ 图形库 VTK 的 3D 图形工具包. 也能集成到 Ipython 实现交互)
最后, 关于图形化工具的原话: 基于 Web 技术 (比如 JavaScript) 的图形化是必然的发展趋势. 毫无疑问. 许多基于 Flash 或 JavaScript 的静态或交互式图形化工具已经出现了很多年. 而且类似的新工具包 (如 d3.js 及其分支项目) 一直都在不断涌现. 相比之下, 非 Web 式的图形化开发工作在近几年中减慢了许多. Python 以及其他数据分析和统计计算环挽 (如 R) 都是如此. 于是, 开发方向就变成了实现数据分析和准备工具 (如 pandas) 与 Web 浏览器之间更为紧密的集成.
来源: https://juejin.im/post/5ac71a896fb9a028de44f137