前言:

  • 前面已经写过Numpy、pandas,数据分析三剑客就剩下matplotlib了
  • 用pip安装matplotlib的时候不知道为什么出了[WinError 87],只好手动安装,步骤在这里。


文章目录

  • 数据可视化
  • 线型图
  • 柱状图
  • 直方图
  • 密度图
  • 带密度估计的规格化直方图
  • 散布图
  • 饼图
  • 高级绘图



安装好matplotlib之后就随便用用看看有什么好玩的。使用Jupyter可以直接把图生成在页面上。

import matplotlib
import pandas as pd
import numpy as np

数据可视化

Pandas 的数据可视化使用 matplotlib 为基础组件。更基础的信息可参阅 matplotlib 相关内容。本节主要介绍 Pandas 里提供的比 matplotlib 更便捷的数据可视化操作。

线型图

Series 和 DataFrame 都提供了一个 plot 的函数。可以直接画出线形图。

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
ts.describe()

[Out:]
count    1000.000000
mean      -15.295693
std        13.609060
min       -40.083112
25%       -26.555117
50%       -13.070779
75%        -4.082425
max        11.133501
dtype: float64

使用plot()方法绘图

ts.plot();

matplotlib与python版本的关系_数据可视化


给定title,设置线体样式style,指定y轴坐标ylim,指定图片大小figsize

# ts.plot? for more help
ts.plot(title='cumsum', style='r-', ylim=[-30, 30], figsize=(4, 3));

matplotlib与python版本的关系_数据可视化_02


更多style:

字符

描述

‘-’

实线样式

‘–’

短横线样式

‘-.’

点划线样式

‘:’

虚线样式

‘.’

点标记

‘,’

像素标记

‘o’

圆标记

‘v’

倒三角标记

‘^’

正三角标记

‘<’

左三角标记

‘>’

右三角标记

‘1’

下箭头标记

‘2’

上箭头标记

‘3’

左箭头标记

‘4’

右箭头标记

‘s’

正方形标记

‘p’

五边形标记

‘*’

星形标记

‘h’

六边形标记1

‘H’

六边形标记2

‘+’

加号标记

‘x’

X标记

‘D’

菱形标记

‘d’

窄菱形标记

‘|’

竖直线标记

‘_’

水平线标记

以及颜色缩写

字符

颜色

'b

蓝色

'g

绿色

'r

红色

'c

青色

'm

品红色

'y

黄色

'k

黑色

'w

白色


构造1000行4列的DataFrame

df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))
df = df.cumsum()
df.describe()

[Out:]
A	B	C	D
count	1000.000000	1000.000000	1000.000000	1000.000000
mean	51.990014	-18.674476	53.110189	-2.162240
std	29.169795	12.869232	27.169108	5.888237
min	-0.042837	-41.647090	-4.793408	-14.653007
25%	28.637957	-32.757807	32.587833	-6.719513
50%	41.773233	-12.875555	52.429776	-2.457030
75%	82.884002	-7.854751	78.647795	2.462142
max	105.062104	3.169023	95.598810	13.215038

根据每一列画出单独图subplots

# df.plot? for more help
df.plot(title='DataFrame cumsum', figsize=(4, 12), subplots=True, sharex=True, sharey=True);

matplotlib与python版本的关系_matplotlib_03


df['ID'] = np.arange(len(df))
df.plot(x='ID', y=['A', 'C'])

matplotlib与python版本的关系_matplotlib_04


柱状图

df = pd.DataFrame(np.random.rand(10, 4), columns=['A', 'B', 'C', 'D'])
df

[Out:]
A	B	C	D
0	0.560815	0.436623	0.140987	0.859090
1	0.769000	0.970060	0.197618	0.264342
2	0.831866	0.135285	0.536257	0.551072
3	0.698514	0.967225	0.346590	0.352452
4	0.552502	0.962830	0.785556	0.085609
5	0.229587	0.936545	0.215518	0.000504
6	0.596842	0.386716	0.385878	0.327201
7	0.328011	0.366872	0.983212	0.995695
8	0.122507	0.140954	0.325839	0.645794
9	0.189820	0.877107	0.623421	0.754679

绘制柱状图

df.iloc[1].plot.bar()

matplotlib与python版本的关系_直方图_05


叠加到一起的柱状图stacked

df.plot.bar(stacked=True)

matplotlib与python版本的关系_数据可视化_06


横向柱状图

df.plot.barh(stacked=True)

matplotlib与python版本的关系_柱状图_07


直方图

直方图是一种对值频率进行离散化的柱状图。数据点被分到离散的,间隔均匀的区间中,绘制各个区间中数据点的数据。

df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),
                   'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])

绘制直方图hist,被分割的条数bins

df['a'].plot.hist(bins=10)

matplotlib与python版本的关系_柱状图_08

df.plot.hist(subplots=True, sharex=True, sharey=True)

matplotlib与python版本的关系_柱状图_09


设置透明alpha

df.plot.hist(alpha=0.5)

matplotlib与python版本的关系_柱状图_10


当所有数据叠加一起的时候符合正态分布

df.plot.hist(stacked=True, bins=20, grid=True)

matplotlib与python版本的关系_柱状图_11


密度图

正态分布(高斯分布)就是一种自然界中广泛存在密度图。比如我们的身高,我们的财富,我们的智商都符合高斯分布。

绘制密度图

df['a'].plot.kde()

matplotlib与python版本的关系_直方图_12


df.plot.kde()

matplotlib与python版本的关系_matplotlib_13

# 平均数为高斯分布的中点
df.mean()

[Out:]
a    0.947151
b   -0.026500
c   -1.039657
dtype: float64

# 方差为高斯分布的宽度
df.std()

[Out:]
a    1.014101
b    1.028685
c    1.030285
dtype: float64

带密度估计的规格化直方图

n1 = np.random.normal(0, 1, size=200) # N(0, 1)
n2 = np.random.normal(10, 2, size=200) # N(10, 4)
s = pd.Series(np.concatenate([n1, n2]))
s.describe()

[Out:]
count    400.000000
mean       5.172248
std        5.397582
min       -3.644105
25%        0.061406
50%        3.691510
75%       10.250011
max       16.031112
dtype: float64

同时绘制直方图和密度图

s.plot.hist(bins=100, alpha=0.5, normed=True)
s.plot.kde(style='r-')

matplotlib与python版本的关系_数据可视化_14


散布图

散布图是把所有的点画在同一个坐标轴上的图像。是观察两个一维数据之间关系的有效的手段。

df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b');

matplotlib与python版本的关系_直方图_15

df = pd.DataFrame({'a': np.concatenate([np.random.normal(0, 1, 200), np.random.normal(6, 1, 200)]),
                  'b': np.concatenate([np.random.normal(10, 2, 200), np.random.normal(0, 2, 200)]),
                  'c': np.concatenate([np.random.normal(10, 4, 200), np.random.normal(0, 4, 200)])})
df.describe()

[Out:]
a	b	c
count	400.000000	400.000000	400.000000
mean	2.974366	5.035267	5.011259
std	3.158428	5.492017	6.572784
min	-3.149143	-5.022496	-13.671181
25%	0.079920	-0.130532	-0.128582
50%	2.800326	5.587717	4.901682
75%	5.923731	10.139781	10.002299
max	8.688234	16.233516	19.855104


df.plot.scatter(x='a', y='b')

matplotlib与python版本的关系_直方图_16


饼图

s = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')
s

[Out:]
a    0.505096
b    0.295620
c    2.855217
d    2.716670
Name: series, dtype: float64

s.plot.pie(figsize=(6,6))

matplotlib与python版本的关系_柱状图_17

s.plot.pie(labels=['AA', 'BB', 'CC', 'DD'], colors=['r', 'g', 'b', 'c'],
           autopct='%.2f', fontsize=20, figsize=(6, 6))

matplotlib与python版本的关系_柱状图_18

df = pd.DataFrame(3 * np.random.rand(4, 2), index=['a', 'b', 'c', 'd'], columns=['x', 'y'])
df

[Out:]
	x	y
a	1.115819	2.348513
b	2.681690	0.816831
c	0.855954	0.380417
d	2.235465	1.958050


df.plot.pie(subplots=True, figsize=(9, 4))

matplotlib与python版本的关系_柱状图_19


高级绘图

高级绘图函数在 pandas.tools.plotting 包里。

from pandas.tools.plotting import scatter_matrix
df = pd.DataFrame(np.random.randn(1000, 4), columns=['a', 'b', 'c', 'd'])
scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal='kde');

matplotlib与python版本的关系_matplotlib_20


s = pd.Series(0.1 * np.random.rand(1000) + 0.9 * np.sin(np.linspace(-99 * np.pi, 99 * np.pi, num=1000)))

y = np.linspace(-99 * np.pi, 99 * np.pi, num=1000)

s.plot.

from pandas.tools.plotting import lag_plot

s = pd.Series(0.1 * np.random.rand(1000) + 0.9 * np.sin(np.linspace(-99 * np.pi, 99 * np.pi, num=1000)))
lag_plot(s);

matplotlib与python版本的关系_直方图_21

from pandas.tools.plotting import autocorrelation_plot

s = pd.Series(0.7 * np.random.rand(1000) + 0.3 * np.sin(np.linspace(-9 * np.pi, 9 * np.pi, num=1000)))
autocorrelation_plot(s);

matplotlib与python版本的关系_matplotlib_22