Matplotlib库简介

684 阅读30分钟

一、Matplotlib绘制图形

我们已经学习过了 NumPy 的统计分析,数据的各项指标都可以以真实的数据提供出来, 有的同学可能有疑问?

我们为什么要进行可视化?而可视化在数据分析中又占什么样的地位?我们之前大致说过,可视化可以将我们的数据更加直观的表现出来,方便我们得到数据分析的结论,那么还有什么作用吗?那么我们一起来一下这一组数据

观察上面这一组数据,并没有发现什么规律,但是我们可以对其进行统计指标计算,来得到:

而观察统计指标中的均值、标准差,会发现整个的 x_ *、y __ * 数据的均值、标准差都是 基本一样的,那么到底可不可以得到,整个 x_ * 数据的规律是一样的?整个 y_ * 数据的规律 是一样的?

那么我们对该数据进行可视化,来绘制图形来查看该数据的分布情况,会发现:

而观察数据的分布散点,可以得到:该数据的分布规律并不相同。那么根据指标所得到 的规律只是显示着该数据的某些指标相同,但是真实的规律还得需要图形的支撑,不然不足 以提供强大的说服力

那么到底如何实现图像可视化?接下来我们一起来学习 Matplotlib 可视化库

二、Matplotlib 数据可视化基础

对 Matplotlib 认识

Matplotlib 是一个 Python 的 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形

Matplotlib 绘图流程

1、创建画布与创建子图

第一部分主要作用是构建出一张空白的画布,并可以选择是否将整个画布划分为多个部 分,方便在同一幅图上绘制多个图形的情况。最简单的绘图可以省略第一部分,而后直接在默认的画布上进行图形绘制

函数名称函数作用
plt.figure创建一个空白画布,可以指定画布大小,像素
figure.add_subplot创建并选中子图,可以指定子图的行数,列数,与选中图片编号
plt.subplots_adjust调整子图之间的间距,wspace 为调整宽度,hspace 为调整高度

2、添加画布内容

第二部分是绘图的主体部分,其中添加标题,坐标轴名称,绘制图形等步骤是并列的, 没有先后顺序,可以先绘制图形,也可以先添加各类标签,但是添加图例一定要在绘制图形之后

函数名称函数作用
plt.title在当前图形中添加标题,可以指定标题的名称、位置、颜色、字体大小等参数
plt.xlabel在当前图形中添加 x 轴名称,可以指定位置、颜色、字体大小等参数
plt.ylabel在当前图形中添加 y 轴名称,可以指定位置、颜色、字体大小等参数
plt.xlim指定当前图形 x 轴的范围,只能确定一个数值区间,而无法使用字符串标识
plt.ylim指定当前图形 y 轴的范围,只能确定一个数值区间,而无法使用字符串标识
plt.xticks指定 x 轴刻度的数目与取值
plt.yticks指定 y 轴刻度的数目与取值
plt.legend指定当前图形的图例,可以指定图例的大小、位置、标签

3、存与展示图形

第三部分主要用于保存和显示图形

函数名称函数作用
plt.savafig保存绘制的图片,可以指定图片的分辨率、边缘的颜色等参数
plt.show在本机显示图形

现在人们对于旅游、出行越来越热衷,一旦出现周末、小假期,基本都会出行旅游,所以对于天气的依赖越来越重要,以 xx 城市下一周天气温度走势为例,来理解绘图三部曲, 以下为某城市下一周天气

温度表:

​ 某城市下一周天气温度表

日期周一周二周三周四周五周六周日
xx 城市天气温度(℃)15202223201816

以下为绘制出的效果图:

代码实现:

# 导包
import matplotlib.pyplot as plt
import numpy as np

# 1、创建画布
# figsize : 画布大小,元组形式,可以给定画布的宽、高
# dpi :像素大小
# 返回值:画布对象
plt.figure()

# 2、绘图及修饰
# 以下一周某城市的天气温度走势 来理解绘图流程
# 折线图
# 折线图 ---要素:点  --->坐标(x,y)
# (x1,y1) (x2,y2) ...(xn,yn) ---n个点的坐标
# 注意:在绘制折线图时,要求单独传入横坐标、纵坐标,绘制的时候会一一对应
#  准备 横轴数组 ---周一、周二、....、周日
# 注意:如果横轴为中文,绘制的时候,需要用序号来代替中文,后续再替换过来
x = np.arange(1, 8)
#  准备 纵轴数组
y = np.array([15, 20, 22, 23, 20, 18, 16])

# 绘制折线图
plt.plot(x, y)

# 3、图形展示
plt.show()

三、折线图绘制

折线图(line chart)是一种将数据点按照顺序连接起来的图形。可以看作是将散点图,按照 x 轴坐标顺序连接起来的图形

折线图的主要功能是查看因变量y随着自变量x改变的趋势,最适合用于显示随时间(根 据常用比例设置)而变化的连续数据。同时还可以看出数量的差异,增长趋势的变化

可以使用 plt.pyplot 绘制折线图

matplotlib.pyplot.plot(*args, **kwargs)

plot 函数在官方文档的语法中只要求填入不定长参数,实际可以填入的主要参数主要

如下:

参数名称说明
x,y接收 array,表示 x 轴和 y 轴对应的数据。无默认
color接收特定 string,指定线条的颜色。默认为 None
linestyle接收特定 string。指定线条类型,默认为“-“
marker接收特定 string。表示绘制的点的类型。默认为 None
alpha接收 0-1 的小数。表示点的透明度。默认为 None

在 pyplot 中几乎所有的默认属性都是可以控制的,例如视图窗口大小以及每英寸点数、 线条宽度、颜色和样式、坐标轴、坐标和网格属性、文本、字体等

1、线条的常用参数的取值:

rc参数名称解释取值
lines.linewidth线条宽度取 0-10 之间的数值,默认为 1.5
lines.linestyle线条样式可取“-”,“--”,“-.”,“:”四种,默认为“-”
lines.marker线条上点的形状可取“o”,“D”,“h”,“.”,“,” ,“S”等 20 种,默认为 None
lines.markersize点的大小取 0-10 之间的数值,默认为 1

2、常用线条样式解释:

linestyle 取值意义
-实线
--长虚线
-.点线
:短虚线

3、点的样式解释:

marker 取值意义
‘o’圆圈
‘D’菱形
‘h’六边形 1
‘H’六边形 2
‘-’水平线
‘8’八边形
‘p’五边形
‘,’像素
‘+’加号
‘None’
‘.'
's'正方形
‘*’星号
'd'小菱形
'v'一角朝下的三角形
'<'一角朝左的三角形
'>'一角朝右的三角形
'^'一角朝上的三角形
‘\’竖线
‘x’X

4、常用颜色说明

颜色缩写代表的颜色
b蓝色
g绿色
r红色
c青色
m品红
y黄色
k黑色
w白色

另外需要注意:

由于默认的 pyplot 字体并不支持中文字符的显示,因此需要通过设置 font.sans-serif 参数改变绘图时的字体,使得图形可以正常显示中文,同时,由于更改字体后,会导致坐标 轴中的部分字符无法显示,因此需要同时更改 axes.unicode_minus 参数

支持中文代码示例:

# 默认不支持中文 ---修改RC参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 增加字体之后变得不支持负号,需要修改RC参数让其继续支持负号
plt.rcParams['axes.unicode_minus'] = False

如果需要更改画布颜色、坐标轴字体颜色、坐标轴、边框颜色等,也可以去更改 rcParams 参数

代码示例:

# 颜色对照表
# https://tool.oschina.net/commons?type=3
# 如果需要更改画布颜色、坐标轴字体颜色、坐标轴、边框颜色等,也可以去更改 rcParams 参数
# x轴字体颜色
plt.rcParams['xtick.color'] = '#FFFFFF'

# y轴字体颜色
plt.rcParams['ytick.color'] = '#FFFFFF'

# 背景颜色
plt.rcParams['axes.facecolor'] = '#0D0434'

# 边框颜色
plt.rcParams['axes.edgecolor'] = '#FFFFFF'

# 保存的画布的颜色
plt.rcParams['savefig.facecolor'] = '#0D0434'

更多设置可查看:matplotlibrc 文件

以 xx 城市、yy 城市下一周天气温度走势为例,绘制折线图,以下为 xx 城市、yy 城市

下一周天气温度表:

​ xx 城市和 yy 城市下一周天气温度表

日期周一周二周三周四周五周六周日
xx 城市天气温度(℃)15202223201816
yy 城市天 气温度(℃)-10-8-12-10-8-6-1

以下为绘制出的效果图:

代码实现:

# 导包
import matplotlib.pyplot as plt
import numpy as np

# 1、创建画布
# figsize : 画布大小,元组形式,可以给定画布的宽、高
# dpi :像素大小
# 返回值:画布对象
plt.figure()
# 默认不支持中文 ---修改RC参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 增加字体之后变得不支持负号,需要修改RC参数让其继续支持负号
plt.rcParams['axes.unicode_minus'] = False

# 如果需要更改画布颜色、坐标轴字体颜色、坐标轴、边框颜色等,也可以去更改 rcParams 参数
# x轴字体颜色
plt.rcParams['xtick.color'] = '#FFFFFF'

# y轴字体颜色
plt.rcParams['ytick.color'] = '#FFFFFF'

# 背景颜色
plt.rcParams['axes.facecolor'] = '#045332'

# 边框颜色
plt.rcParams['axes.edgecolor'] = '#FFFFFF'

# 保存的画布的颜色
plt.rcParams['savefig.facecolor'] = '#0D0434'

# 2、绘图及修饰
# 以下一周某城市的天气温度走势 来理解绘图流程
# 折线图
# 折线图 ---要素:点  --->坐标(x,y)
# (x1,y1) (x2,y2) ...(xn,yn) ---n个点的坐标
# 注意:在绘制折线图时,要求单独传入横坐标、纵坐标,绘制的时候会一一对应
#  准备 横轴数组 ---周一、周二、....、周日
# 注意:如果横轴为中文,绘制的时候,需要用序号来代替中文,后续再替换过来
x = np.arange(1, 8)
#  准备 纵轴数组
y1 = np.array([15, 20, 22, 23, 20, 18, 16])

y2 = np.array([-10, -8, -12, -10, -8, -6, 1])

# 绘制折线图
# 如果想要一张图中绘制多条折线,那么只需要多绘制几次就可以了
# color : 线的颜色
# linestyle : 线的样式
# linewidth: 线的宽度
# marker :点的样式
# markersize :点的大小
# markerfacecolor:点的填充颜色
# markeredgecolor:点的边缘颜色
plt.plot(x, y1, color='r', linestyle=':', linewidth=1.2, marker="*", markersize=7, markerfacecolor='b',
         markeredgecolor='g')
plt.plot(x, y2, color='k', linestyle='-.', linewidth=1.2, marker="d", markersize=7, markerfacecolor='r',
         markeredgecolor='r')

# 增加标题
plt.title('下一周广州、哈尔滨天气温度走势')

# 设置横轴名称
plt.xlabel('日期')

# 设置纵轴名称
plt.ylabel('温度(℃ )')

# 修改横轴刻度
# 注意:如果是需要将刻度修改为中文,传递2个参数
# 参数1 : 序号
# 参数2 :设置的中文刻度
xticks = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
plt.xticks(x, xticks)

# 修改纵轴刻度
# 注意:如果只是重新设置刻度范围,只需要传递1个参数
# 参数:新的刻度范围
yticks = np.arange(-12, 33, 3)
plt.yticks(yticks)

# 增加图例
# loc :表示 图例的设置位置
plt.legend(['广州温度', '哈尔滨温度'], loc=0)

# 进行标注
# plt.text --->每次只能标记一个点
# 循环标注
for i, j in zip(x, y1):
    # 参数1 : 标注位置的横坐标
    # 参数2 : 标注位置的纵坐标
    # 参数3 : 标注的内容,字符串
    plt.text(i, j + 1, '%d℃' % j, horizontalalignment='center')

for i, j in zip(x, y2):
    # 参数1 : 标注位置的横坐标
    # 参数2 : 标注位置的纵坐标
    # 参数3 : 标注的内容,字符串
    plt.text(i, j + 1, '%d℃' % j, horizontalalignment='center')

# 保存图片
plt.savefig('./下一周广州、哈尔滨天气温度走势.png')

# 3、图形展示
plt.show()

折线图任务:

绘制 2000-2017 各产业与行业的国民生产总值折线图

通过绘制 2000-2017 各产业与行业的国民生产总值折线图,分别能够发现我国经济各产业与各行业增长趋势

以下为绘制效果展示:

代码实现:

import matplotlib.pyplot as plt
import numpy as np

# 绘制2000-2017年各产业、行业季度生产增加总值的发展趋势折线图

# 1、加载数据
fp = np.load('./国民经济核算季度数据.npz', allow_pickle=True)
# # 遍历
# for k in fp:
#     print(k)
#  获取保存的数组
columns = fp['columns']
values = fp['values']

print('columns:\n', columns)
print('values:\n', values)

# 2、绘制图形
#  创建画布
# figsize=(40, 20), dpi=80
# 返回画布对象
fig = plt.figure()
# 默认不支持中文 ---修改RC参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 增加字体之后变得不支持负号,需要修改RC参数让其继续支持负号
plt.rcParams['axes.unicode_minus'] = False

# 设置子图间距
# wspace=None,  ----> 子图之间的宽度间距 ---设置为[0,1]小数  --->子图宽度的占比
# hspace=None   ----> 子图之间的高度间距 ---设置为[0,1]小数  --->子图高度的占比
plt.subplots_adjust(hspace=0.2)

# 绘制图形及修饰
# 创建子图1
fig.add_subplot(2, 1, 1)

# 横轴  ---时间 --序号
x = np.arange(values.shape[0])

# 纵轴 --各个产业的增加总值
y = values[:, 3:6]
# y1 = values[:, 3]
# y2 = values[:, 4]
# y3 = values[:, 5]
#
# # 绘图
plt.plot(x, y)
# 注意:此时使用一个横轴,对应多列数据,拿出每一列与横轴一一对应去绘制折线图
# plt.plot(x, y1)
# plt.plot(x, y2)
# plt.plot(x, y3)

# 增加标题
plt.title('2000-2017年各个产业、行业增加总值')

# 纵轴名称
plt.ylabel('生产总值(亿元)')

# 从columns 中获取
legend = [tmp[:4] for tmp in columns[3:6]]
# 增加图例
plt.legend(legend, loc=0, fontsize=5)

# 修改横轴刻度
# xticks = values[:, 1]
# 参数rotation=45 -->旋转45°
# plt.xticks(x[::4], xticks[::4], rotation=45)

# 创建子图2
fig.add_subplot(2, 1, 2)

# 横轴  ---时间 --序号
x = np.arange(values.shape[0])

# 纵轴 --各个产业的增加总值
y = values[:, 6:]
# y1 = values[:, 3]
# y2 = values[:, 4]
# y3 = values[:, 5]
#
# # 绘图
plt.plot(x, y)
# 注意:此时使用一个横轴,对应多列数据,拿出每一列与横轴一一对应去绘制折线图
# plt.plot(x, y1)
# plt.plot(x, y2)
# plt.plot(x, y3)


# 纵轴名称
plt.ylabel('生产总值(亿元)')

# 从columns 中获取
legend = [tmp[:2] for tmp in columns[6:]]
# 增加图例
plt.legend(legend, loc=0, fontsize=3)

# 修改横轴刻度
xticks = values[:, 1]
# 参数rotation=45 -->旋转45°
plt.xticks(x[::4], xticks[::4], rotation=45)

# 保存图片
plt.savefig('./2000-2017年各个产业、行业增加总值.png')
# 图形展示
plt.show()

# 折线图的应用场景:
# 用于查看数据的发展规律、趋势 ---折线图

四、散点图绘制

散点图(scatter diagram)又称为散点分布图,是以一个特征为横坐标,另一个特征 为纵坐标,利用坐标点(散点)的分布形态反映特征间的统计关系的一种图形

值是由点在图表中的位置表示,类别是由图表中的不同标记表示,通常用于比较跨类别的数据

另外,如果可以可以使用曲线拟合的散点,也可以用来反映数据的变化趋势,可以使用 plt.scatter 来绘制散点图

plt.scatter(x, y, s=None, c=None, marker=None, alpha=None, **kwargs)

参数名称说明
x,y接收 array,表示 x 轴和 y 轴对应的数据,无默认
s接收数值或者一维的 array,指定点的大小,若传入一维 array 则表示每个点的大小,默 认为 None
c接收颜色或者一维的 array,指定点的颜色,若传入一维 array 则表示每个点的颜色,默认为 None
marker接收特定 string,表示绘制的点的类型,默认为 None
alpha接收 0-1 的小数,表示点的透明度,默认为 None

以 2000-2017 年各个产业增加总值散点图为例,来绘制散点图

以下为绘制效果展示:

代码实现:

import numpy as np
import matplotlib.pyplot as plt

# 1、加载数据
fp = np.load('./国民经济核算季度数据.npz', allow_pickle=True)
# # 遍历
# for k in fp:
#     print(k)
#  获取保存的数组
columns = fp['columns']
values = fp['values']

print('columns:\n', columns)
print('values:\n', values)

# 2、绘制图形
# 2000-2017各个产业增加总值散点图
# 创建画布
plt.figure(figsize=(16, 14), dpi=80)
# 默认不支持中文 ---修改RC参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 增加字体之后变得不支持负号,需要修改RC参数让其继续支持负号
plt.rcParams['axes.unicode_minus'] = False

# 绘图及修饰
# 绘制散点图
# x = np.array([1, 2, 3])
#
# y = np.array([5, 8, 4])

# x-->横坐标
# y ->纵坐标
# s -->点的大小,可以传一个值,也可以传一个array表示各个点的大小
# c -->点的颜色,可以传一个值,也可以传一个array表示各个点的颜色
# marker --->点的样式
# alpha --->透明度 [0,1],数值越小越透明,越大越凝实
# 注意: x 和 y 必须是相同元素个数,一一对应关系
# plt.scatter(x, y, s=[7, 12, 30], c=['r', 'g', 'b'], marker='*', alpha=1)


# 构建横轴数据
x = np.arange(values.shape[0])
# 构建纵轴数据
y1 = values[:, 3]
y2 = values[:, 4]
y3 = values[:, 5]

# 绘制图形
plt.scatter(x, y1, c='r', marker='*')
plt.scatter(x, y2, c='k', marker='d')
plt.scatter(x, y3, c='b', marker='o')

# 修饰
# 增加标题
plt.title('2000-2017年各个产业增加总值散点图')

# 横轴名称
plt.xlabel('时间')

# 纵轴名称
plt.ylabel('生产总值(亿元)')

# 修改横轴刻度
plt.xticks(x[::4], values[:, 1][::4], rotation=45)

# 增加图例
legend = [tmp[:4] for tmp in columns[3:6]]
plt.legend(legend, loc=0)

# 保存图片
plt.savefig('./2000-2017年各个产业增加总值散点图.png')

# 图形展示
plt.show()

# 散点图应用场景:
# 1、查看数据的发展规律、趋势
# 2、查看数据的分布规律

散点图任务:绘制 2000-2017 各产业与行业的国民生产总值散点图

国民生产总值数据总共有三大产业的国民生产总值,以及农业、工业、建筑、批发、交通、餐饮、金融、房地产和其他行业各个季度的增加值

通过散点图分析三大行业的国民生产总值可以发现我国产业结构。通过比较各行业间季 度的增加值则可以发现国民经济的主要贡献行业

以下为绘制效果展示:

五、柱状图绘制

柱状图(bar chart)是一种以长方形的长度为变量的表达图形的统计报告图,由一系列 高度不 等的纵向条纹表示数据分布的情况,用来比较两个或以上的价值(不同时间或者不 同条件),只有一个变量,通常利用于较小的数据集分析,用柱状图可以比较直观地看出各组数据之间的差别

matplotlib.pyplot.bar(left,height,width = 0.8,bottom = None,hold = None, data = None**kwargs)

常用参数及说明如下表所示:

参数名称说明
left接收 array,表示 x 轴数据,无默认
height接收 array,表示 x 轴所代表数据的数量,无默认
width接收 0-1 之间的 float,指定直方图宽度,默认为 0.8
color接收特定 string 或者包含颜色字符串的 array,表示直方图颜色,默认为 None

以 2000 年、2017 年各个产业、行业对比为例,绘制柱状图:

以下为绘制效果展示:

代码实现:

import matplotlib.pyplot as plt
import numpy as np

# 柱状图---高低不同的长方形柱子来表示,各柱子之间一般存在间距
# 主要用于对比不同类别的数据,可以直观的得到不同类别的差距
# 比较类别不宜过多,一般不超过9类,适用于少量数据

# plt.bar --->用来绘制柱状图

# 绘制2000、2017年各个产业、行业对比柱状图

# 1、加载数据
fp = np.load('./国民经济核算季度数据.npz', allow_pickle=True)
# # 遍历
# for k in fp:
#     print(k)
#  获取保存的数组
columns = fp['columns']
values = fp['values']

print('columns:\n', columns)
print('values:\n', values)

# 2、绘图
# 创建画布
fig = plt.figure()
# 默认不支持中文 ---修改RC参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 增加字体之后变得不支持负号,需要修改RC参数让其继续支持负号
plt.rcParams['axes.unicode_minus'] = False

# 绘图及修饰
# 添加子图
fig.add_subplot(2, 2, 1)
# 2000年第一季度 各个产业对比柱状图
# x--->横轴坐标
# height --->柱子的高度 ---即 x 所一一对应的 y值
# width --->柱子的宽度 ---默认是0.8
# color--->柱子的颜色
x = np.arange(1, 4)
#
y = values[0, 3:6]  # --->2000年第一季度的 第一、第二、第三产业的值
# 绘图
plt.bar(x, y, width=0.5, color='#6495ED')  # color='r'

# 增加标题
plt.title('2000年第一季度各个产业增加总值对比柱状图')

# 横轴名称
plt.xlabel('产业')

# 纵轴名称
plt.ylabel('生产总值(亿元)')

# 修改横轴刻度
xticks = [tmp[:4] for tmp in columns[3:6]]
plt.xticks(x, xticks)

# # 标注
for i, j in zip(x, y):
    plt.text(i, j, '%.2f亿元' % j, horizontalalignment='center')

# 柱状图不需要 图例

fig.add_subplot(2, 2, 2)

fig.add_subplot(2, 2, 3)

fig.add_subplot(2, 2, 4)

# 图形展示
plt.show()

六、直方图绘制

直方图(Histogram)又称质量分布图,是统计报告图的一种,由一系列高度不等的纵 向条纹或线段表示数据分布的情况,一般用横轴表示数据所属类别,纵轴表示数量或者占比

用直方图可以比较直观地看出产品质量特性的分布状态,便于判断其总体质量分布情况,直方图可以发现分布表无法发现的数据模式、样本的频率分布和总体的分布

matplotlib.pyplot.hist( x,bins=10,range=None, normed=False,weights=None,cumulative=False,bottom=None,histtype=u'bar',align=u'mid',orientation=u'vertical',rwidth=None,log=False,color=None,label=None,stacked=False,hold=None,**kwargs )

参数名称说明
x(n,) array or sequence of (n,) arrays 这个参数是指定每个 bin(箱子)分布 的数据,对应 x 轴
binsinteger or array_like, optional,这个参数指定 bin(箱子)的个数,也就是总 共有几条条状图
colorcolor or array_like of colors or None, optional,这个指定条状图的颜色

以 xx 班级学员的身高分布为例,绘制直方图,以下为某班级学员身高统计表:

身高(cm)143.7154.7162.5172.6153.2174.4......

以下为绘制效果展示:

代码实现:

import matplotlib.pyplot as plt
import numpy as np

# 直方图---质量分布图 ---用来查看的数据的分布状态
# 也是由高低不同的柱子组成,一般情况下,柱子之间是连续
# 横轴 ---数据的分布区间
# 纵轴 ---各个区间内的数据的数量
# 适用于大量数据

# plt.hist  --->用来绘制直方图

# 假设某班级 存在30名同学, 查看该班级同学的身高分布范围

# 1、先生成30名同学身高数据 --随机生成
hight = np.random.uniform(low=140, high=190, size=30)
print('hight:\n', hight)
# 身高是保留一位小数
hight = np.array([float('%.1f' % tmp) for tmp in hight])
print('保留一位小数的身高:\n', hight)

# 1、创建画布
plt.figure()
# 默认不支持中文 ---修改RC参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 增加字体之后变得不支持负号,需要修改RC参数让其继续支持负号
plt.rcParams['axes.unicode_minus'] = False

# 2、绘图及修饰
# x --->真实绘制直方图的数据
# bins --->分组状态,可以是指定分组的组数,或者是一个array,表示分组节点
# 绘制直方图
# plt.hist(hight, bins=5) # 系统默认分组
# 自定义分组
# bins = [140, 150, 160, 170, 180, 190]
# orientation='horizontal' # 水平显示直方图
# rwidth --->柱子的宽度,默认为1
# plt.hist(hight, bins=bins, edgecolor='k')  # color='r' -->柱子的颜色

# 自定义等宽
# (1) 确定分组组数
group_num = 5

# (2) 确定数据 最大值、最小值
max_height = np.max(hight, axis=0)
min_height = np.min(hight, axis=0)

print('身高的最大值:\n', max_height)
print('身高的最小值:\n', min_height)

# (3)确定组内间距
# (最大-最小) / 分组个数  --->向上取整   ---> int
#  np.ceil --->向上取整
#  np.floor --->向下取整
width = np.ceil((max_height - min_height) / group_num)

#  (4) 确定分组节点
# 结尾+ width 的原因: 是为了最后一个区间肯定包含最大值
bins = np.arange(min_height, max_height + width, width)

print('bins:\n', bins)

# 绘图
plt.hist(hight, bins=bins, edgecolor='k',color='#6495ED')

# 修改刻度
plt.xticks(bins)

# 增加网格线
plt.grid(b=True, axis='y', alpha=0.2)

# 直方图 不需要设置图例

# 设置标题
plt.title('班级的同学身高分布直方图')

# 横轴名称
plt.xlabel('身高')

# 纵轴名称
plt.ylabel('人数(个)')

# 保存图片
plt.savefig('./班级的同学身高分布直方图.png')

# 3、图形展示
plt.show()

通过绘制了柱状图、直方图,那么柱状图、直方图长的非常类似,它们又有什么区别呢?

直方图和柱状图最让人迷惑的地方,就是它们长得非常相似

实际上,直方图和柱状图 无论是在图表意义、适用数据上,还是图表绘制上,都有很大的不同,主要分为以下区别:

(1)直方图展示数据的分布,柱状图比较数据的大小

(2)直方图 X 轴为定量数据,柱状图 X 轴为分类数据

(3)直方图柱子无间隔,柱状图柱子有间隔

(4)直方图柱子宽度可不一,柱状图柱子宽度须一致。 那么到底使用直方图需要注意哪些点?

(1)注意组距,组距会影响直方图呈现出来的数据分布,因此在绘制直方图的时候需 要多次尝试改变组距

(2)X 轴上为左闭右开区间

(3)注意 Y 轴所代表的变量

七、饼图绘制

饼图(Pie Graph)是将各项的大小与各项总和的比例显示在一张“饼”中,以“饼” 的大小来确定每一项的占比。饼图可以比较清楚地反映出部分与部分、部分与整体之间的比例关系,易于显示每组数据相对于总数的大小,而且显现方式直观

pie 函数: matplotlib.pyplot.pie(x,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6,shadow=False,labeldistance=1.1,startangle=None,radius=None, … )

常用参数及说明如下表所示:

参数名称说明
x接收 array,表示用于绘制饼的数据, 无默认
autopct接收特定 string,指定数值的显示方式,默认为 None
explode接收 array,表示指定项离饼图圆心 为 n 个半径,默认为 None
pctdistance接收 float,指定每一项的比例和距离饼 图圆心 n 个半径,默认为 0.6
labels接收 array,指定每一项的名称,默 认为 None
labeldistance接收 float,指定每一项的名称和距离饼 图圆心多少个半径,默认1.1
color接收特定 string 或者包含颜色字符 串的 array,表示饼图颜色,默认为 None
radius接收 float。表示饼图的半径,默认为 1

以 2017 年第一季度各个产业增加总值占比为例,绘制饼图:

绘制效果展示:

代码实现:

import numpy as np
import matplotlib.pyplot as plt

# 饼图---将各项数据绘制在一张饼中,用以对比部分与部分、部分与整体的关系。

# plt.pie来进行绘制饼图。

# 2017年第一季度各个产业增加总值占比饼图

# 1、加载数据
fp = np.load('./国民经济核算季度数据.npz', allow_pickle=True)
# # 遍历
# for k in fp:
#     print(k)
#  获取保存的数组
columns = fp['columns']
values = fp['values']

print('columns:\n', columns)
print('values:\n', values)

# 2、绘图
# 创建画布
plt.figure()
# 默认不支持中文 ---修改RC参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 增加字体之后变得不支持负号,需要修改RC参数让其继续支持负号
plt.rcParams['axes.unicode_minus'] = False

# 绘制图形及修饰
# x --->需要绘制饼图的数据
x = values[-1, 3:6]
# 绘制饼图
# explode --->各部分远离饼心的距离(半径),或者:两两之间的缝隙的大小
explode = (0.01, 0.01, 0.02)
# labels --->指的是各部分的名称
labels = [tmp[:4] for tmp in columns[3:6]]

# colors --->各部分的颜色
colors = ['r', 'g', 'b']
# autopct ---> 占比的数值
autopct = '%.1f%%'
# pctdistance=0.6  --->占比的数值 位置
# shadow --->阴影
shadow = True
# labeldistance=1.1 --->labels 的位置
# radius -->半径的大小,默认为 1
# center : 中心位置
# wedgeprops={'linewidth': 10} 阴影边线
plt.pie(x, explode=explode, labels=labels, autopct=autopct,
        shadow=shadow)  # colors=colors

# 设置图例
plt.legend(labels)

# 设置标题
plt.title('2017年第一季度各个产业增加总值占比饼图')

# 保存图片
plt.savefig('./2017年第一季度各个产业增加总值占比饼图.png')

# 图形展示
plt.show()

八、箱线图绘制

箱线图(boxplot)也称箱须图,其绘制需使用常用的统计量,能提供有关数据位置和分散情况的关键信息,尤其在比较不同特征时,更可表现其分散程度差异,箱线图利用数据 中的五个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据,它也 可以粗略地看出数据是否具有对称性、分布的分散程度等信息,特别可以用于对几个样本的比较

箱线图外形: boxplot 函数:matplotlib.pyplot.boxplot(x,notch=None,sym=None,vert=None,whis=None,positions=None,widths=None,patch_artist=None,meanline=None,labels=None, … )

常用参数及说明如下表所示:

参数名称说明
x接收 array,表示用于绘制箱线图的数据,无默认
positions接收 array,表示图形位置,默认为 None
notch接收 boolean,表示中间箱体是否有 缺口。默认为 None
widths接收 scalar 或者 array,表示每个箱 体的宽度。默认为 None
sym接收特定 sting,指定异常点形状,默 认为 None
labels接收 array,指定每一个箱线图的标 签,默认为 None
vert接收 boolean,表示图形是横向纵向 或者横向,默认为 None
meanline接收 boolean,表示是否显示均值线,默认为 False

以 2000-2017 年各个产业增加总值为例,绘制箱线图:

绘制效果展示:

代码实现:

import matplotlib.pyplot as plt
import numpy as np

# 箱线图--外形类似于风箱,使用5个统计指标量(最小值、
# 下四分位数、中位数、上四分位数、最大值)来描述数据。
# 查看数据是否对称、分散情况。

# 查看箱子的长度 来获取数据是否对称、以及分散程度的大小

# (剔除异常值的功能---后续再去看)

# plt.boxplot -->绘制箱线图

# 1、加载数据
fp = np.load('./国民经济核算季度数据.npz', allow_pickle=True)
# # 遍历
# for k in fp:
#     print(k)
#  获取保存的数组
columns = fp['columns']
values = fp['values']

print('columns:\n', columns)
print('values:\n', values)

# 2、绘图
# 创建画布
plt.figure()
# 默认不支持中文 ---修改RC参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 增加字体之后变得不支持负号,需要修改RC参数让其继续支持负号
plt.rcParams['axes.unicode_minus'] = False

# 绘图及修饰
# 2000-2017年第一产业的增加总值的箱线图
# x--->绘制箱线图的数据
# 有些版本中,必须将整个箱子的数据作为一个整体,可以将一个箱子的数据作为一个元组的元素
x = (values[:, 3], values[:, 4], values[:, 5])
# notch ---是否开缺口  --置信区间(confidence interval -->CI)
# sym --异常值的标注样式
# vert  ---控制着箱线图的方向,vert=False 水平箱线图
# meanline -->均线 必须和 showmeans 才能显示均值线
# labels ---> 各个箱子的名称
labels = ['第一产业', '第二产业', '第三产业']
# positions ---> 位置 --->指定箱子显示的位置,一般为默认
# positions=[3, 2, 1]
plt.boxplot(x, notch=True, sym='*', meanline=True, showmeans=True, labels=labels)

# 增加标题
plt.title('2000-2017年各个产业增加总值箱线图')
# 增加横轴名称
plt.xlabel('产业')
# 增加纵轴名称
plt.ylabel('生产总值(亿元)')
# 保存图片
plt.savefig('./2000-2017年各个产业增加总值箱线图.jpeg')
# 不需要图例

# 图形展示
plt.show()

九、K 线图绘制

K 线图形态可分为反转形态、整理形态及缺口和趋向线等,后 K 线图因其细腻独到的标画方式而被引入到股市及期货市场,股市及期货市场中的 K 线图的画法包含四个数据,即开 盘价、最高价、最低价、收盘价,所有的 k 线都是围绕这四个数据展开,反映大势的状况和价格信息。如果把每日的 K 线图放在一张纸上,就能得到日 K 线图,同样也可画出周 K 线图、 月 K 线图

其中开盘价、最高价、最低价、收盘价的理解:

开盘价: 开盘价又称开市价,是指某种证券在证券交易所每个交易日开市后的第一笔每股买卖成交价格。

收盘价: 收盘价为当日该证券最后一笔交易前一分钟所有交易的成交量加权平均价(含最后一笔 交易)。当日无成交的,以前收盘价为当日收盘价。

最高价: 指某种证券在每个交易日从开市到收市的交易过程中所产生的最高价格。如果当日该种 证券成交价格没有发生变化,最高价就是即时价;若当日该种证券停牌,则最高价就是前收 市价。

最低价: 最低价指某种证券在每个交易日从开市到收市的交易过程中所产生的最低价格

以 tushare 中的股票数据为例,绘制 K 线图,以下为股票代码为 600728 的股票的 ohlc 数据:

绘制效果展示:

代码示例:

import tushare  as ts
import mpl_finance as mpf
import matplotlib.pyplot as plt
import numpy as np

# 需要安装tushare  + 清华   源
# pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple
# 需要安装 mpl_finance
# pip install mpl_finance -i https://pypi.tuna.tsinghua.edu.cn/simple

# 从tushare 中获取某一支 股票的交易信息
# 获取股票信息
# code ---股票代码
# start-- 开始日期
# ktype='D' ---每个交易日都查询
# autype='qfq' --复权
data = ts.get_k_data('600728', start='2020-01-01', ktype='D')
print('data:\n', data)

# 时间  ---ohlc
# 获取数据
price = data[['open', 'high', 'low', 'close']].values

# 绘制
time = np.arange(price.shape[0]).reshape((-1, 1))

# 拼接合并
plt_data = np.concatenate((time, price), axis=1)

# 1、创建画布
fig = plt.figure()

# 2、绘制图形
# 先获取坐标系
ax = fig.add_axes([0.1, 0.3, 0.8, 0.6])

# ax ---坐标系
# quotes --->数据---》sequence of (time, open, high, low, close, ...)
mpf.candlestick_ohlc(ax, plt_data, colorup='r', colordown='g', width=0.5)
# 设置横轴刻度
plt.xticks(np.arange(price.shape[0])[::30], data['date'][::30], rotation=45)
# 3、图形展示
plt.show()

十、雷达图

之前所讲的绘制图形的数据都是二维数据,那么如果想要查看高维度的数据,那么需要 绘制另外一种图形——雷达图

雷达图可以查看该样本在不同特征的得分,来评价该样本。雷达图在游戏中、企业员工 评测中频繁使用。如,以下为王者荣耀玩家中某玩家的王者战报情况:

到底如何绘制雷达图?

可以使用 plt.polar 来绘制雷达图

以某玩家的王者荣耀战绩信息为例,绘制雷达图,来查看该玩家的战力情况,是否是“大 腿”,以下为该玩家的对战信息:

生存评分输出评分团战评分KDA发育评分
23.544.55

绘制结果展示:

代码实现:

import matplotlib.pyplot as plt
import numpy as np

# 可以从不同的角度来评价数据对象
# 可以用来绘制高维度数据  --->长度超过2的一维数组
# person [hight,weight] --->二维空间
# person [hight,weight,score,math,...] --->n维空间

# 可以使用雷达图将 高维度 数据 --在平面中描述


# 以某玩家的王者战报 --- 雷达图绘制 --从不同的属性来查看该是否是大腿?

# 极坐标


# 1、创建画布
plt.figure()
# 默认不支持中文 ---修改RC参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 增加字体之后变得不支持负号,需要修改RC参数让其继续支持负号
plt.rcParams['axes.unicode_minus'] = False

# 2、绘制图形
datalength = 5
# 准备角度
angle = np.linspace(0, 2 * np.pi, datalength, endpoint=False)
print('angle:\n', angle)
# 闭合角度
angle = np.concatenate((angle, [angle[0]]), axis=0)
print('angle:\n', angle)
# # 准备数据
data = np.array([2, 3.5, 4, 4.5, 5])
# 数据闭合
data = np.concatenate((data, [data[0]]), axis=0)
print('data:\n', data)
# # 雷达图
plt.polar(angle, data, color='r', marker='*', markersize=12)

#
ticks = ['生存评分', '输出评分', '团战评分', 'KDA', '发育评分']

# 修改刻度
plt.xticks(angle[:-1], ticks)

# 3、图形展示
plt.show()