IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 机器学习入门 03 —— Matplotlib使用 -> 正文阅读

[Python知识库]机器学习入门 03 —— Matplotlib使用


系列文章

机器学习入门 01 —— 机器学习概述
机器学习入门 02 —— 环境搭建(Jupyter Notebook 及扩展库的安装与使用)
机器学习入门 03 —— Matplotlib使用


3.1 Matplotlib之Hello World

1 Matplotlib介绍

?

  • 专门用于开发2D图表(3D也可以,但不常用)

  • 以渐进、交互式方式实现数据可视化(之前我Python博客里用过网页来进行可视化,而Matplotlib是python真正的可视化方式)

  • 为什么要学习Matplotlib?

    • 可视化是整个数据挖掘的关键辅助工具,能让我们清晰理解数据从而调整分析方法。
    • 例如下面图片就是用Matplotlib实现
    举例

    ?

2 Matplotlib画图流程

?

# 1. 导包
import matplotlib.pyplot as plt

# 2. 创建画布,figsize:指定图的长宽,dpi图像的清晰度。函数返回一个fig对象。
plt.figure(figsize=(5,3), dpi=100)

# 3. 绘制折线图,参数分别是X和Y轴
plt.plot([1,2,3,4,5],[17,17,18,15,11])

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

效果:

效果图

图像结构:

图像结构

?

3.2 基础绘图功能(以折线图为例)

?

1 坐标刻度、标签、网格、图像保存

下面是常用功能演示:

说明下,里面用到了列表生成式,[random.uniform(15, 18) for i in x],相当于是遍历了60次(因为x长度60),每次获取[15,18)间的一个数,最后得到一个列表。

import matplotlib.pyplot as plt
import random

# 0. 准备数据
x = range(60) # 创建0-60的列表(不包括60)
y = [random.uniform(15, 18) for i in x] # uniform(a, b)随机生成一个a-b间的一个数;

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

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

# 2.1 添加x y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 修改x,y轴刻度显示,使其间隔为5(x[::]表示步长为5)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

# 2.2 添加网格显示(linestyle是每个线条样式,alpha是线条透明度)
plt.grid(True, linestyle='--', alpha=0.5)

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

# 3. 保存图像(这一步必须在show前面,因为show会释放资源)
plt.savefig('temp.png')

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

效果:

效果

可能很多人在进行中文标签显示时出现了乱码,这是因为Matplotlib的默认字体并不支持中文,所以需要我们对字体进行切换。解决方法请看我另一篇博客:解决Matplotlib中文乱码问题

2 在一个坐标系里绘制多个图

?

代码:

import matplotlib.pyplot as plt
import random

x = range(60)
y1 = [random.uniform(15, 18) for i in x]
y2 = [random.uniform(3, 6) for i in x]  # 第二条折线的数据

plt.figure(figsize=(10, 6), dpi=100)

# label指定图例,即右上角的指示
plt.plot(x, y1, label="第一条")
# 绘制第二条折线, color 指定颜色(r、g、b、w、c、m、y、k),linestyle指定线条样式(-、--、-.、:、空格)
plt.plot(x, y2, color='y', linestyle='--', label="第二条")
# 显示图例, loc指示图例的位置(best、center、upper right、lower left等)
plt.legend(loc='best')

x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)

plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])


plt.grid(True, linestyle='--', alpha=0.5)

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

plt.savefig('temp.png')

plt.show()

效果:

效果

3 在一个图里绘制多个坐标系

?

前面是面向过程,这里使用到了对象,所以有点区别。在这里,主要是用set方法进行设置。

代码:

import matplotlib.pyplot as plt
import random

x = range(60)
y1 = [random.uniform(15, 18) for i in x]
y2 = [random.uniform(3, 6) for i in x]

# 1. 创建画布。要绘制1行2列个坐标系,返回fig 图像,axes 坐标系列表
fig, axes = plt.subplots(nrows=1,ncols=2, figsize=(20, 8), dpi=100)

# 2. 绘制图像。
axes[0].plot(x, y1, label="第一条")
axes[1].plot(x, y2, color='y', linestyle='--', label="第二条")
axes[0].legend(loc='best')
axes[1].legend(loc='best')

# 2.1 构造xy轴刻度
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)

# 2.2 设置xy轴刻度,使其每个刻度间隔为5
axes[0].set_xticks(x[::5]) # 这是真实的x轴刻度
axes[0].set_yticks(y_ticks[::5]) # 这是真实的y轴刻度
axes[0].set_xticklabels(x_ticks_label[::5]) # 这是每个真实x轴刻度对应的标签值
# 这是第二个坐标系
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])

# 2.3 添加网格
axes[0].grid(True, linestyle='--', alpha=0.5)
axes[1].grid(True, linestyle=':', alpha=0.5)

# 2.5 添加描述信息
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("中午11点0分到12点之间的温度变化图示", fontsize=10)

axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("中午11点0分到12点之间的温度变化图示", fontsize=10)

# 2.6 图像保存
plt.savefig('temp.png')

# 2.7 图像显示
plt.show()

效果:

效果

?

3.3 常见图形绘制

?

官方链接:https://matplotlib.org/index.html

1 折线图

?

特点:能够显示数据的变化趋势,反映食物的变化情况。(变化)

Api:plt.plot(x, y)

前面的举例都是折线图,这里就不再说明了。

?

2 散点图

?

特点:判断变量之间是否存在数量关联趋势,展示离群点。(分布规律)

Api:plt.scatter(x, y)

# 0.准备数据 
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]

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

# 2.绘制散点图 
plt.scatter(x, y) 

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

?

3 柱状图

?

特点:能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)

Api:plt.bar(x, width, align='center'对齐, color='r')

# 0.准备数据 
# 电影名字 
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽']

# 横坐标 
x = range(len(movie_name)) 

# 纵坐标-票房数据 
y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764] 

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

# 2.绘制柱状图 
plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k','c','g']) 

# 2.1b修改x轴的刻度显示 
plt.xticks(x, movie_name) 

# 2.2 添加网格显示 
plt.grid(linestyle="--", alpha=0.5) 

# 2.3 添加标题 
plt.title("电影票房收入对比") 

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

?

4 直方图

?

特点:绘制连续性的数据,展示一组或多组数据的分布状况(统计)

Api:plt.hist(x, bins=None组距)

import numpy as np
# 随机生成(10000,)服从正态分布的数据
data = np.random.randn(10000)
"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
density:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""
plt.hist(data, bins=40, density=0, facecolor="blue", edgecolor="black", alpha=0.7)
# 显示横轴标签
plt.xlabel("区间")
# 显示纵轴标签
plt.ylabel("频数/频率")
# 显示图标题
plt.title("频数/频率分布直方图")
# 显示
plt.show()
效果

?

5 饼图

?

特点:分类数据的占比情况(占比)

Api:plt.pie(x, label=每部分名称, autopct=占比显示, colors=每部分颜色

label_list = ["第一部分", "第二部分", "第三部分"]    # 各部分标签
size = [55, 35, 10]    # 各部分大小
color = ["red", "green", "blue"]     # 各部分颜色
explode = [0.05, 0, 0]   # 各部分突出值
"""
绘制饼图
explode:设置各部分突出
label:设置各部分标签
labeldistance:设置标签文本距圆心位置,1.1表示1.1倍半径
autopct:设置圆里面文本
shadow:设置是否有阴影
startangle:起始角度,默认从0开始逆时针转
pctdistance:设置圆内文本距圆心距离
返回值
l_text:圆内部文本,matplotlib.text.Text object
p_text:圆外部文本
"""
patches, l_text, p_text = plt.pie(size, explode=explode, colors=color, labels=label_list, labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=90, pctdistance=0.6)
plt.axis("equal")    # 设置横轴和纵轴大小相等,这样饼才是圆的
plt.legend()
plt.show()
效果

6 特殊柱状图

两条柱状图

import matplotlib.pyplot as plt
import matplotlib
# 设置中文字体和负号正常显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

label_list = ['2014', '2015', '2016', '2017']    # 横坐标刻度显示值
num_list1 = [20, 30, 15, 35]      # 纵坐标值1
num_list2 = [15, 30, 40, 20]      # 纵坐标值2
x = range(len(num_list1))
"""
绘制条形图
x:长条形中点横坐标
y:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(x, num_list1, width=0.4, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar([i + 0.4 for i in x], num_list2, width=0.4, color='green', label="二部门")
plt.ylim(0, 50)     # y轴取值范围
plt.ylabel("数量")
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index + 0.2 for index in x], label_list)
plt.xlabel("年份")
plt.title("某某公司")
plt.legend()     # 设置题注

# 每条柱顶部文本
for rect in rects1:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
for rect in rects2:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
plt.show()
效果

水平柱状图

import matplotlib

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

price = [39.5, 39.9, 45.4, 38.9, 33.34]
"""
绘制水平条形图方法barh
参数一:y轴
参数二:x轴
"""
plt.barh(range(5), price, height=0.7, color='steelblue', alpha=0.8)      # 从下往上画
plt.yticks(range(5), ['亚马逊', '当当网', '中国图书网', '京东', '天猫'])
plt.xlim(30,47)
plt.xlabel("价格")
plt.title("不同平台图书价格")
for x, y in enumerate(price):
    plt.text(y + 0.2, x - 0.1, '%s' % y)
plt.show()
效果

堆叠柱状图

import matplotlib.pyplot as plt
import matplotlib

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

label_list = ['2014', '2015', '2016', '2017']
num_list1 = [20, 30, 15, 35]
num_list2 = [15, 30, 40, 20]
x = range(len(num_list1))
rects1 = plt.bar(x, num_list1, width=0.45, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar(x, num_list2, width=0.45, color='green', label="二部门", bottom=num_list1)
plt.ylim(0, 80)
plt.ylabel("数量")
plt.xticks(x, label_list)
plt.xlabel("年份")
plt.title("某某公司")
plt.legend()
plt.show()
效果
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 23:15:46  更:2021-07-28 23:16:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 4:08:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码