【要点抢先看】

1.散点图的画法举例
2.频次直方图的画法举例
3.误差线图的画法举例

【妹子说】今天我们继续学习matplotlib绘图的相关内容嘛~

对,在这一集,我们介绍在数据分析中使用非常高频的几种图的形式。

首先说散点图,散点图和线形图最大的区别,顾名思义就是这种图形不再由线段进行连接,而是由一个一个独立的点、圆圈或者其他指定的形状构成:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10,100)
plt.scatter(x, np.sin(x), marker='o')
plt.grid()
plt.show()



python matplot频率变概率分布_mplfinance画k线图

【妹子说】如果我们使用上一集中介绍的线形图的绘制方法,在指定线型的情况下,一样可以画出这个图来,那为什么要单独再学一个新的函数呢?

这个问题问的好,因为我这个例子举的过于简单,没能体现其优势。实质上,使用plt.sactter相比plt.plot在创建散点图时的优势是具有更高的灵活性,他可以单独控制每一个散点的不同属性(颜色、大小等),这样就可以通过(坐标位置、颜色、大小)这些多维信息,来表征更多的数据特征,并进行更精细的控制。

我们来绘制这样一组散点图,每个点的位置坐标(x,y)是服从标准正态分布的随机值,点的颜色灰度值是位于(0,1)空间中的随机样本,点的大小是随机值得1000倍,单位是像素。这样通过位置、大小、颜色等多维信息,就能更丰富的表现出散点数据背后所蕴含的多重信息了。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.RandomState(0)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000 * rng.rand(100)
plt.scatter(x,y,c=colors,s=sizes,alpha=0.3)
plt.colorbar()
plt.grid(True)
plt.show()



python matplot频率变概率分布_mplfinance画k线图_02

从图中,我们可以直观看出散点的大小所对应的数量信息,右侧添加的颜色条,同来指示颜色所对应的数值信息。这类多颜色与多特征的散点图在探索与演示数据时非常有用。

第二类我们要说的图形类型是频次直方图。

我们先画一个最简单的频次直方图,生成1000个服从标准正态分布的随机变量,然后观察他们在每个点的出现次数。

import numpy as np
import matplotlib.pyplot as plt

data = np.random.randn(1000)
ret = plt.hist(data)
print(ret)
plt.show()

(array([  15.,   39.,   88.,  188.,  216.,  200.,  123.,   84.,   36.,   11.]), 
array([-2.68292233, -2.1248507 , -1.56677908, -1.00870746, -0.45063583,
0.10743579,  0.66550742,  1.22357904,  1.78165067,  2.33972229,
2.89779391]), <a list of 10 Patch objects>)



python matplot频率变概率分布_matplotlib 散点图_03

最简单的频次直方图

仔细琢磨一下其实会有一些疑问,这个图里面只有10个数据条,但是很显然1000个随机变量的取值显然不止10个。在默认情况下,hist函数会将所有的随机变量取值划分为10个取值范围,然后统计每个取值范围内的变量数,并绘就此图。

我们可以从程序结果看出,hist函数是有返回值的,返回的是一个2元元组,元组第一个ndarray对象是数据条的高度序列,元组第二个ndarray对象是每个数据条的边缘横坐标。

其实如果我们只想得到上述返回数据,而并不想画图,那么可以用下面的方法即可。

import numpy as np
import matplotlib.pyplot as plt

data = np.random.randn(1000)
ret = np.histogram(data)
print(ret)
plt.show()

(array([ 11,  36,  81, 179, 216, 209, 164,  71,  27,   6], dtype=int64), 
array([-2.83330638, -2.25443586, -1.67556534, -1.09669482, -0.5178243 ,
0.06104622,  0.63991674,  1.21878726,  1.79765778,  2.3765283 ,
2.95539882]))

那么我们可以通过指定hist函数中的一些参数,来个性化的调整频次直方图的显示效果。

通过bins参数可以指定数据条的个数;normed可以指定是否将频数进行标准化,alpha指定透明度;还有histtype、color、edgecolor等线性、颜色等参数

import numpy as np
import matplotlib.pyplot as plt

data = np.random.randn(1000)
plt.hist(data, bins=40, normed=True, alpha=0.5,
histtype='stepfilled',color='steelblue')
plt.grid(True)
plt.show()



python matplot频率变概率分布_matplotlib 直方图_04

指定参数的频直方图次

结合频次直方图中的透明度这个参数,我们再来多做做文章,比如,我们想对不同均值、方差分布特征的正态分布随机变量进行对比,那该怎么做?显然我们想到的是把不同的几个正态分布图画在一张图里进行比较。

import numpy as np
import matplotlib.pyplot as plt

data1 = np.random.normal(0, 0.8, 1000)
data2 = np.random.normal(-2, 1, 1000)
data3 = np.random.normal(3, 2, 1000)
plt.grid(True)
kwargs = dict(histtype='stepfilled', alpha=0.5, normed=True, bins=40)
plt.hist(data1, **kwargs)
plt.hist(data2, **kwargs)
plt.hist(data3, **kwargs)
plt.show()



python matplot频率变概率分布_直方图_05

最后我们来介绍基本误差线图

我们在图上画50个散点,然后每个点的误差设定为一个随机值,满足标准正态分布。同时作为对照,我们在另一个图中设置每个点的误差值为一个标量常数而非随机数组。当然这个例子可能没有什么物理意义,只是来演示一下这种图怎么画

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 50)
dy = np.random.normal(0, 1, 50)
y = np.sin(x) + dy*np.random.randn(50)
plt.subplot(211)
plt.errorbar(x, y, yerr=dy, fmt='.k')
plt.grid(True)
plt.subplot(212)
plt.errorbar(x, y, yerr=0.8, fmt='o')
plt.grid(True)
plt.show()



python matplot频率变概率分布_matplotlib直方图_06

【妹子说】这两集,我确实学到了几种基本的绘图方法,但是印象中我之前所见到的很多数据可视化图表貌似比这还要更复杂一些呢~

说的没错,不过也别着急,在下一集,我们再深入到一些常用的绘图细节中一探究竟,进一步丰富我们的绘图技巧。