python 高级算法绘图

1,语法:绘制两个窗口,一起显示。
# 手动构建 matplotlib 窗口
plt.figure(
    'sub-fig',                    #窗口标题栏文本
    figsize=(4, 3),        #窗口大小 <元组>
    facecolor=''        #图表背景色
)
plt.show()

plt.figure方法不仅可以构建一个新窗口,如果已经构建过title='xxx'的窗口,又使用figure方法构建了title='xxx' 的窗口的话,mp将不会创建新的窗口,而是把title='xxx'的窗口置为当前操作窗口。

**设置当前窗口的参数**

语法:测试窗口相关参数
# 设置图表标题 显示在图表上方
plt.title(title, fontsize=12)
# 设置水平轴的文本
plt.xlabel(x_label_str, fontsize=12)
# 设置垂直轴的文本
plt.ylabel(y_label_str, fontsize=12)
# 设置刻度参数   labelsize设置刻度字体大小
plt.tick_params(..., labelsize=8, ...)
# 设置图表网格线  linestyle设置网格线的样式
    #    -  or solid 粗线
    #   -- or dashed 虚线
    #   -. or dashdot 点虚线
    #   :  or dotted 点线
plt.grid(linestyle='')
# 设置紧凑布局,把图表相关参数都显示在窗口中
plt.tight_layout()

示例:绘制两个图像窗口
python 高级算法绘图

案例:绘制9宫格矩阵式子图,每个子图中写一个数字。

python 高级算法绘图

**网格式布局(很少使用)**网格式布局支持单元格的合并。绘制网格式子图布局相关API:
python 高级算法绘图

案例:绘制一个自定义网格布局。
import matplotlib.gridspec as mg
plt.figure('GridLayout', facecolor='lightgray')
gridsubs = plt.GridSpec(3, 3)
# 合并0行、0/1列为一个子图
plt.subplot(gridsubs[0, :2])
plt.text(0.5, 0.5, 1, ha='center', va='center', size=36)
plt.tight_layout()
plt.xticks([])
plt.yticks([])

自由式布局(很少使用)

自由式布局相关API:
plt.figure('Flow Layout', facecolor='lightgray')
# 设置图标的位置,给出左下角点坐标与宽高即可
# left_bottom_x: 坐下角点x坐标
# left_bottom_x: 坐下角点y坐标
# width:         宽度
# height:         高度
# plt.axes([left_bottom_x, left_bottom_y, width, height])
plt.axes([0.03, 0.03, 0.94, 0.94])
plt.text(0.5, 0.5, '1', ha='center', va='center', size=36)
plt.show()

 

案例:测试自由式布局,定位子图。
plt.figure('FlowLayout', facecolor='lightgray')

plt.axes([0.1, 0.2, 0.5, 0.3])
plt.text(0.5, 0.5, 1, ha='center', va='center', size=36)
plt.show()

2,散点图

可以通过每个点的坐标、颜色、大小和形状表示不同的特征值。

| 身高 | 体重 | 性别 | 年龄段 | 种族 |
| ---- | ---- | ---- | ------ | ---- |
| 180  | 80   | 男   | 中年   | 亚洲 |
| 160  | 50   | 女   | 青少   | 美洲 |

绘制散点图的相关API:
plt.scatter(
    x,                     # x轴坐标数组
    y,                    # y轴坐标数组
    marker='',             # 点型
    s=10,                # 大小
    color='',            # 颜色
    edgecolor='',         # 边缘颜色
    facecolor='',        # 填充色
    zorder=''            # 图层序号
)

numpy.random提供了normal函数用于产生符合 正态分布 的随机数
python 高级算法绘图

案例:绘制平面散点图。
# 散点图示例
python 高级算法绘图

cmap颜色映射表参照附件:cmap颜色映射表*

3,填充:以某种颜色自动填充两条曲线的闭合区域。
plt.fill_between(
    x,                # x轴的水平坐标
    sin_x,            # 下边界曲线上点的垂直坐标
    cos_x,            # 上边界曲线上点的垂直坐标
    sin_x<cos_x,     # 填充条件,为True时填充
    color='',         # 填充颜色
    alpha=0.2        # 透明度
)

案例:绘制两条曲线: sin_x = sin(x)    cos_x = cos(x / 2) / 2    [0-8π] 
python 高级算法绘图

4,条形图(柱状图):绘制柱状图的相关API:
# 设置使中文显示完整
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure('Bar', facecolor='lightgray')
plt.bar(
    x,                # 水平坐标数组
    y,                # 柱状图高度数组
    width,            # 柱子的宽度
    color='',         # 填充颜色
    label='',        #
    alpha=0.2        #
)
 

案例:先以柱状图绘制苹果12个月的销量,然后再绘制橘子的销量。

python 高级算法绘图

 

5,直方图

绘制直方图相关API:
plt.hist(
    x,                     # 值列表        
    bins,                 # 直方柱数量
    color,                 # 颜色
    edgecolor             # 边缘颜色
)

案例:绘制统计直方图显示图片像素亮度分布:
import numpy as np
import matplotlib.pyplot as plt
import scipy.misc as sm

img = sm.imread('../data/forest.jpg', True)
print(img.shape)

pixes = img.ravel()
plt.figure('Image Hist', facecolor='lightgray')
plt.title('Image Hist', fontsize=18)
plt.xticks(np.linspace(0, 255, 11))
plt.hist(x=pixes, bins=10, color='dodgerblue', range=(0, 255), edgecolor='white', normed=False)
plt.show()
 

 6,扩展:随机数模块与概率分布

numpy提供了random模块生成服从特定统计规律的随机数序列。

一组随机数可能呈现如下分布:
统计班级同学体重:[63.2, 76.5, 65.7, 68.9, 59.4 ... ]
统计班级同学身高:[163.2, 176.5, 165.7, 168.9, 159.4 ... ]
统计班级同学到班时间:['07:20:22','07:30:48','07:21:23','07:24:58' ...]
```

又或者呈现如下分布:

```
统计班级同学体重级别:[偏轻, 中等, 偏重, 超重, 中等, 偏重, 超重, 中等, 偏重...]
统计班级同学身高级别:[偏低, 中等, 中等, 中等, 中等, 偏高, 中等, 中等, 偏高...]
统计最近班级同学迟到人数(共10人):[0, 1, 3, 0, 0, 1, 2, 0, 0, 0 ....]

```

二项分布(binomial)

二项分布就是重复n次独立事件的伯努利试验(Bernoulli experiment)。在每次试验中只有两种可能的结果,而且两种结果发生与否互相对立,并且相互独立,事件发生与否的概率在每一次独立试验中都保持不变,例如抛硬币。

```python
# 产生size个随机数,每个随机数来自n次尝试中的成功次数,其中每次尝试成功的概率为p
np.random.binomial(n, p, size)
```

二项分布可以用于求如下场景的概率的近似值:

1. 某人投篮命中率为0.3,投10次,进5个球的概率。
sum(np.random.binomial(10, 0.3, 200000) == 5) / 200000
 

1. 某人打客服电话,客服接通率是0.6,一共打了3次,都没人接的概率。
sum(np.random.binomial(3, 0.6, 200000) == 0) / 200000

示例:模拟某人以30%命中率投篮,每次投10个,计算并打每种进球可能的概率
python 高级算法绘图

 

超几何分布(hypergeometric)

超几何分布是统计学上一种离散概率分布。它描述了从有限N个物件(其中包含M个指定种类的物件)中抽出n个物件,成功抽出该指定种类的物件的次数(不放回)。以下是一组超几何分布的示例:

(1)10件产品中含有3件次品,从中任意取4件产品,所取出的次品件数服从超几何分布;
(2)袋中有8红球4白球,从中任意摸出5个球,摸出红球个数服从超几何分布;
(3)某班45个学生,女生20人,现从中选7人做代表,代表中所含女生的人数服从超几何分布;
(4)15张卡片中含有5件写有“奖”字,从中任意取3件产品,所取出的卡片中含有奖字的卡片张数服从超几何分布;

(5)10位代表中有5位支持候选人A,随机采访3人,其中支持候选人A的人数服从超几何分布;
(6)盘中装有10个粽子,豆沙粽2个,肉粽3个,白粽5个,从中任选3个,取到的豆沙粽的个数服从超几何分布。

API介绍:
# 产生size个随机数,每个随机数t为在总样本中随机抽取nsample个样本后好样本的个数,总样本由ngood个好样本和nbad个坏样本组成:np.random.hypergeometric(ngood, nbad, nsample, size)


示例一:从6个好苹果、4个坏苹果中抽取3个苹果,返回好球的数量(执行10次)
python 高级算法绘图

 

正态分布(normal)
# 产生size个随机数,服从标准正态(期望=0, 标准差=1)分布。
np.random.normal(size)
# 产生size个随机数,服从正态分布(期望=1, 标准差=10)。
np.random.normal(loc=1, scale=10, size)


标准正态分布概率密度: \frac{e^{-\frac{x^2}{2}}}{\sqrt{2\pi}}
 

案例:生成10000个服从正态分布的随机数并绘制随机值的频数直方图。python 高级算法绘图

6,饼图,绘制饼状图的基本API:
plt.pie(
    values,         # 值列表        
    spaces,         # 扇形之间的间距列表
    labels,         # 标签列表
    colors,         # 颜色列表
    '%d%%',            # 标签所占比例格式
    shadow=True,     # 是否显示阴影
    startangle=90    # 逆时针绘制饼状图时的起始角度
    radius=1        # 半径
)

案例:绘制饼状图显示6门编程语言的流行程度:
python 高级算法绘图