Python机器学习入门——科学计算库(Matplotlib)

Posted 零陵上将军_xdr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python机器学习入门——科学计算库(Matplotlib)相关的知识,希望对你有一定的参考价值。

Matplotlib基础

什么是Matplotlib:

1、 是专门用于开发2D图表(包括3D图表)
2、以渐进、交互式方式实现数据可视化

Matplotlib特点:

能将数据进行可视化,更直观的呈现
使数据更加客观、更具说服力

实现一个简单的Matplotlib画图 — 以折线图为例

matplotlib.pyplot模块

matplotlib.pytplot包含了一系列类似于matlab的画图函数。

import matplotlib.pyplot as plt

图形绘制流程:

1、创建画布 – plt.figure()

plt.figure(figsize=(), dpi=)
figsize:指定图的长宽
dpi:图像的清晰度
返回fig对象

2、绘制图像 – plt.plot(x, y)

3.显示图像 – plt.show()

折线图绘制与显示

举例:展现郑州一周的天气,比如从星期一到星期日的天气温度如下:

import matplotlib.pyplot as plt

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 2.绘制折线图
plt.plot([1, 2, 3, 4, 5, 6 ,7], [38,30,34,28,39,35,37])

# 3.显示图像
plt.show()

基本绘图功能

以郑州市温度为例绘制温度变化折线图

基本绘图

import matplotlib.pyplot as plt
import random

# 画出温度变化图

# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)

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

# 3.显示图像
plt.show()

添加自定义x,y刻度

plt.xticks(x, **kwargs)

x:要显示的刻度值

plt.yticks(y, **kwargs)

y:要显示的刻度值
import matplotlib.pyplot as plt
import random

# 画出温度变化图

# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)

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

# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(20,40)

# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])

# 3.显示图像
plt.show()


此时我们遇到了中文乱码情况,导入一下两行代码就可以解决乱码:

plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['axes.unicode_minus']=False 

添加网格显示

为了更加清楚地观察图形对应的值,我们可以添加网格:

plt.grid(True, linestyle=’–’, alpha=0.5)

import matplotlib.pyplot as plt
import random

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 画出温度变化图

# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)

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

# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(20,40)

# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])

# 添加网格
plt.grid(True, linestyle='--', alpha=0.5)

plt.show()

添加描述信息

添加x轴、y轴描述信息及标题,通过fontsize参数可以修改图像中字体的大小

plt.xlabel(“时间”)
plt.ylabel(“温度”)
plt.title(“中午11点0分到12点之间的温度变化图示”, fontsize=20)

import matplotlib.pyplot as plt
import random

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 画出温度变化图

# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)

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

# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(20,40)

# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])

# 添加网格
plt.grid(True, linestyle='--', alpha=0.5)

#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)

plt.show()

图像保存

#保存图片到指定路径
plt.savefig(“zhengzhoutianqi.png”)

注意:plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。

import matplotlib.pyplot as plt
import random

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 画出温度变化图

# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)

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

# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(20,40)

# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])

# 添加网格
plt.grid(True, linestyle='--', alpha=0.5)

#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)

# 图像保存
plt.savefig("zhengzhoutianqi.png")
plt.show()

一个坐标系中绘制多个图像

多次plot

例如在郑州天气的基础上再添加一个北京天气

代码实现:

import matplotlib.pyplot as plt
import random

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 画出温度变化图

# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
y_beijing= [random.uniform(15, 34) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)

# 2.绘制折线图
plt.plot(x, y_zhengzhou,color='b',label='郑州',linestyle='-.')
plt.plot(x,y_beijing,color='r',label='北京',linestyle='-')

# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(50)

# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])

# 添加图例
plt.legend(loc=0)

# 添加网格
plt.grid(True, linestyle='--', alpha=0.5)

#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)

# 图像保存
plt.savefig("zhengzhoutianqi.png")
plt.show()

添加图例

上个代码中,存在:

plt.plot(x, y_zhengzhou,color=‘b’,label=‘郑州’,linestyle=’-.’)
plt.plot(x,y_beijing,color=‘r’,label=‘北京’,linestyle=’-’)

其中出现了折线效果和图例,其中的设计参数如下:

颜色字符风格字符
r 红色- 实线
g 绿色- - 虚线
b 蓝色-. 点划线
w 白色: 点虚线
c 青色’ ’ 留空、空格
m 洋红
y 黄色
k 黑色

loc的参数是图例位置

Location StringLocation Code
‘best’0
‘upper right’1
‘upper left’2
‘lower left’3
‘lower right’4
‘right’5
‘center left’6
‘center right’7
‘lower center’8
‘upper center’9
‘center’10

多个坐标系显示— plt.subplots(面向对象的画图方法)

可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数,创建一个带有多个axes(坐标系/绘图区)的图

matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw)

返回对象:

fig : 图对象
axes : 返回相应数量的坐标系

plt.函数名()相当于面向过程的画图方法,axes.set_方法名()相当于面向对象的画图方法。

代码实现(郑州与北京市天气为例):

import matplotlib.pyplot as plt
import random

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False # 设置正常显示符号

fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=100)

x=range(60)
y1=[random.uniform(2,25) for i in x]
y2=[random.uniform(25,35) for i in x]
axes[0].plot(x,y1,label='北京',color='g',linestyle='-')
axes[1].plot(x,y1,label='郑州',color='r',linestyle='--')

y_ticks=range(40)
x_ticks=['11时{}分'.format(i)  for i in x]

axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks[::5])

axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks[::5])

axes[0].grid(True,linestyle='-',alpha=0.8)
axes[1].grid(True,linestyle='-',alpha=0.8)

axes[0].set_xlabel('时间')
axes[0].set_ylabel('温度')
axes[0].set_title("中午11点--12点某城市温度变化图", fontsize=20)

axes[1].set_xlabel('时间')
axes[1].set_ylabel('温度')
axes[1].set_title("中午11点--12点某城市温度变化图", fontsize=20)

axes[0].legend(loc=0)
axes[1].legend(loc=0)

plt.show()

常见图形绘制

散点图

定义:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

plt.scatter(x, y)

import matplotlib.pyplot as plt


x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01,  20.67, 288.64,
       163.56, 120.06, 207.83, 342.75, 147.9 ,  53.06, 224.72,  29.51,
        21.61, 483.21, 245.25, 399.25, 343.35]

y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61,  24.9 , 239.34,
       140.32, 104.15, 176.84, 288.23, 128.79,  49.64, 191.74,  33.1 ,
        30.74, 400.02, 205.35, 330.64, 283.45]

plt.figure(figsize=(20,8),dpi=100)

plt.scatter(x,y)
plt.show()

柱状图

plt.bar(def bar(x, height, width=0.8,bottom=None,*,align='center',data=None,**kwargs))

案例:统计电影票房


```python
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(20,8),dpi=200)

movie_name=['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
x=range(len(movie_name))

y=[73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]

plt.bar(x,y,width=0.5,color=['b','r','g','y','c','m','y','k','c','g','b'])
plt.xticks(x,movie_name)

plt.xlabel('电影名称',fontsize=20)
plt.grid(True,linestyle='-',alpha=0.5)

plt.show()
plt.bar

饼图

用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)

plt.pie(x, labels=,autopct=,colors)

Parameters:

以上是关于Python机器学习入门——科学计算库(Matplotlib)的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习入门——科学计算库(Matplotlib)

NumPy快速入门笔记

Python机器学习入门之导学+无监督学习

『Python』Numpy学习指南第十章_高端科学计算库scipy入门(系列完结)

Python语言下的机器学习库

AI:Python与人工智能相关的库/框架(机器学习&深度学习&数据科学/计算机视觉/自然语言处理)的简介案例应用之详细攻略