<学习笔记>从零开始自学Python-之-常用库篇(十二)Matplotlib

        Matplotlib 是Python中类似 MATLAB的绘图工具,Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建2D图表和一些基本的3D图表,可根据数据集(DataFrame,Series)自行定义x,y轴,绘制图形(线形图,柱状图,直方图,密度图,散布图等等),能够解决大部分的需要。Matplotlib中最基础的模块是pyplot。

1、Matplotlib绘图的基本流程如下:

 2、中文显示问题

Matplotlib默认是不显示中文的,如果要显示中文,可以用指定字体的办法来设定,在程序开头加入以下两句:

import matplotlib as mpl
mpl.rcParams['font.family']='Kaiti'  #设定字体为楷体,当然也可以设为其他字体,只要你电脑里有这个字体就行

windows常用的字体类型如下:

中文英文
黑体SimHei
微软雅黑Microsoft YaHei
微软正黑体Microsoft JhengHei
新宋体NSimSun
标楷体标楷体
楷体KaiTi
仿宋FangSong
仿宋_GB2312FangSong_GB2312
楷体_GB2312KaiTi_GB2312
细明体MingLiU

3、基本格式,以plot(画线)为例

3.1 创建一个Figure对象,相当于准备好一个画布

基本语法:plt. figure(figsize, facecolor),figsize参数可以指定画布大小,像素,单位为英寸。

3.2 画图,即在画板上作画

Matplotlib提供了很多种图形的画法,这里我们以plot(画线)为例,语法如下:

plt.plot(x,y,ls,lw,lable,color)   根据x,y数据绘制直线、曲线、标记点,ls为线型linestyle,lw为线宽linewidth,lable为标签文本内容,color为颜色。

3.3 保存图形

plt.savafig()  保存绘制的图形,可以指定图片的分辨率、边缘的颜色等参数。

plt.show() 在本机显示图形

3.4 完整代码如下:

import matplotlib as mpl             #约定俗成一般把matplotlib简写成 mpl
import matplotlib.pyplot as plt      #约定俗成一般把matplotlib.pyplot简写成 pltmpl.rcParams['font.family']='Kaiti'          #设定中文字体为楷体
plt.rcParams['axes.unicode_minus']=False     #plt.figure(figsize=(300,200))      #设定画布大小为300*200x = [1,2,3,4,5]                    #X轴的数值
y = [2,4,6,8,10]                   #Y轴的数值plt.plot(x, y, label='第一条线')   #以x,y的数值对应起来画一条直线,即在图上沿着(1,2)(2,4)(3,6)(4,8)(5,10)这5个点画一条直线plt.xlabel('时间线')            #设定X轴的标签为“时间线”
plt.ylabel('增长值')            #设定Y轴的标签为“增长值”
plt.title('增长折线图')         #设定整个图形的标签为“增长折线图”
plt.legend()                   #设置图表的图例
plt.show()                     #在本机显示图片

显示的图形如下

 4、常用的2D图形

4.1 使用plot绘制折线和曲线图

plot除了画直线图外,还可以画折线图和曲线图

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as npmpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=Falseplt.figure(figsize=(300,200))x1 = [1,2,3]
y1 = [1,2,3]
plt.plot(x1, y1, label='第一条线')x2 = [0,1,2,3,4,5]
y2 = [0,3,1,2,3,1]
plt.plot(x2, y2, label='第二条线')x3 = np.linspace(0, 2*np.pi, 100)
plt.plot(x3, np.sin(x3),'r',label='第三条线')plt.xlabel('时间线')
plt.ylabel('增长值')
plt.title('plot绘图')
plt.legend()
plt.show()

效果如下:

4.2 使用bar()绘制柱状图

假设用柱状图来展现两个指标进行对比:

import matplotlib as mpl
import matplotlib.pyplot as pltmpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=Falseimport matplotlib.pyplot as plt
plt.bar([1,3,5,7,9],[5,2,7,8,2], label="指标一")
plt.bar([2,4,6,8,10],[8,6,2,5,6], label="指标二", color='g'
)
plt.legend()
plt.xlabel('项目')
plt.ylabel('数值')
plt.title('柱状图示意')
plt.show()

得到图形如下:

也可以把数据上下对齐,用不同颜色区分柱子,这样对比效果更明显

import matplotlib as mpl
import matplotlib.pyplot as pltmpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=Falsex=[1,2,3,4,5]
y1=[5,2,7,8,2]
y2=[8,6,2,5,6]
#将y2列表变为负数得到列表y3
y3=[-y for y in y2]
print(y3)#设置颜色
plt.bar(x,y1,facecolor='#FFF68F')
plt.bar(x,y3,facecolor="#9999FF")# 柱状图注释设置
for i, j in zip(x, y1):plt.text(i, j, j, ha='center', va='bottom')
for i, j in zip(x, y2):plt.text(i, -j, j, ha='center', va='top')plt.title('数据对比')
plt.show()

 效果如下:

4.3  使用bath()绘制条形图

和柱状图比较类似,只不过条形图是横过来的

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as npmpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=Falsex = np.arange(4)
y = [6,10,4,5]
y1 = [2,6,3,8]bar_width = 0.4
tick_label = ["1月","2月","3月","4月"]plt.barh(x+bar_width,y,bar_width,align="center",color="c",label="项目一",alpha=1)
plt.barh(x,y1,bar_width,align="center",color="b",label="项目二",alpha=1)
plt.yticks(x+bar_width/2,tick_label)
plt.title('条形图')
plt.legend()
plt.show()

得到图形如下:

 4.4 使用pie()绘制饼图

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as npmpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=Falseimport matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(6, 6)) 
x = [25, 45, 69, 30, 80]
plt.pie(x, autopct='%.2f%%', explode=[0,0.1,0,0,0], shadow=True,labels=list('甲乙丙丁戊'))  plt.show()

效果如下:

4.5 使用scatter()绘制散点图

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as npzuobiao1 = np.random.randn(100,2)
zuobiao2 = np.random.randn(100,2)plt.scatter(zuobiao1[:,0],zuobiao1[:,1],s=80,  # 尺寸c='green',  # 颜色alpha=0.6  # 透明度
) 
plt.scatter(zuobiao2[:,0],zuobiao2[:,1],s=50,  # 尺寸c='blue',  # 颜色alpha=0.6  # 透明度
) plt.show()

效果如下:

5、3D绘图

Matplotlib 已经内置了三维图形,我们需要引入一些模块来实现3D绘图:

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

使用 axes3d 是因为它需要不同种类的轴域,以便在三维中实际绘制一些东西。

fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')

在这里,我们像通常一样定义图形,然后我们将 ax1 定义为通常的子图,只是这 次使用 3D 投影。 我们需要这样做,以便提醒 Matplotlib 我们要提供三维数据。 现在让我们创建一些 3D 数据:

theta = np.linspace(-2 * np.pi, 2 * np.pi, 100)
x = np.sin(theta)
y = np.cos(theta)
z = np.linspace(0.5, 1.5, 100)

我们绘制一个3D折线图的完整代码

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as npstyle.use('fivethirtyeight')
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')  #创建3d坐标系
theta = np.linspace(-2 * np.pi, 2 * np.pi, 100)
x = np.sin(theta)
y = np.cos(theta)
z = np.linspace(0.5, 1.5, 100)
ax1.plot(x,y,z)
ax1.set_xlabel('x axis')
ax1.set_ylabel('y axis')
ax1.set_zlabel('z axis')
plt.show()

绘制的图形如下:

5.2 其他3D图形绘制

5.2.1 散点图

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax3d = fig.add_subplot(projection='3d')  #创建3d坐标系x = np.random.randn(50)
y = np.random.randn(50)
z = np.random.randn(50)
s = np.random.randn(50)*100#ax3d.scatter(x,y,z)  #绘制3d散点图
#ax3d.scatter(x,y,z,marker=['*','o',...]) #设置不同的点样式
ax3d.scatter(x,y,z,s=s,c=s)  #绘制3d散点图
ax3d.scatter(x,y,-3,zdir='z',c='r') #3d坐标系绘制平面散点plt.show()

图形如下:

5.2.2 柱状图

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax3d = fig.add_subplot(projection='3d')  #创建3d坐标系
np.random.seed(2023)x = np.arange(5)
y = np.arange(5)
z = np.zeros(5)  #柱子底部坐标
dx=1    #柱子平面宽度
dy=1    #柱子平面深度
dz=np.random.randint(1,15,5)    #柱子高度ax3d.bar3d(x,y,z,dx,dy,dz)  #绘制3d柱形图plt.show()

图形如下:

5.2.3 火柴图

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax3d = fig.add_subplot(projection='3d')  #创建3d坐标系
np.random.seed(2023)t=np.linspace(-np.pi,np.pi,50)
x = np.sin(t)
y = np.cos(t)
z = np.linspace(-2,2,50)ax3d.stem(x,y,z)  #绘制3d火柴图
#ax3d.stem(x,y,z,orientation="x", bottom=-2) #火柴根在yz平面plt.show()

图形如下

5.2.4 误差图

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax3d = fig.add_subplot(projection='3d')  #创建3d坐标系
np.random.seed(2023)t=np.linspace(-np.pi,np.pi,50)
x = np.sin(t)
y = np.cos(t)
z = np.linspace(-4,4,50)
zerr=np.random.randn(50)#ax3d.errorbar(x,y,z,zerr,capsize=2)  #只有z方向误差
#ax3d.errorbar(x,y,z,zerr,0.2,0.1,capsize=2)  #同时显示zerr,yerr,xerr,注意是三个误差线
ax3d.errorbar(x,y,z,zerr,capsize=2,errorevery=2) #每两个数据点绘制一个误差线。plt.show()

图形如下:

5.2.5 网格面

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax3d = fig.add_subplot(projection='3d')  #创建3d坐标系x,y=np.mgrid[-2:2:0.2,-2:2:0.2]
z = x*np.exp(-x**2-y**2)#ax3d.plot_wireframe(x,y,z)
#ax3d.plot_wireframe(x,y,z,rstride=2,cstride=2)# 两条线合并为一条线
ax3d.plot_wireframe(x,y,z,rcount=10,ccount=12)#设置最大显示线条数plt.show()

图形如下:

5.2.6 曲面图

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax3d = fig.add_subplot(projection='3d')  #创建3d坐标系x,y=np.mgrid[-3:3:0.2,-3:3:0.2]
z = x*np.exp(-x**2-y**2)#ax3d.plot_surface(x,y,z)
#ax3d.plot_surface(x,y,z,rstride=2,cstride=2)# 两条线合并为一条线
#ax3d.plot_surface(x,y,z,rcount=16,ccount=18)#设置最大显示线条数
#ax3d.plot_surface(x,y,z,cmap="YlOrRd")
ax3d.plot_surface(x,y,z,cmap="YlOrRd")plt.show()

图形如下:

5.2.7 非结构化三角网格

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax3d = fig.add_subplot(projection='3d')  #创建3d坐标系
np.random.seed(2023)x=np.random.randn(200)*2
y=np.random.randn(200)*2
z = x*np.exp(-x**2-y**2)#ax3d.tricontour(x,y,z)
ax3d.tricontour(x,y,z,levels=10,cmap="coolwarm")
#ax3d.tricontour(x,y,z,zdir='x',levels=10,cmap="coolwarm") #绘制x方向等值线plt.show()

图形如下:

5.2.8 三维体元素图

import numpy as np
import matplotlib.pyplot as pltfig = plt.figure()
ax3d = fig.add_subplot(projection='3d')#filled为bool类型数组,在True的元素下标位置绘制体元素
i,j,k=np.indices((3,3,3))
filled= (i==j) & (j==k)  #3行3列3层,对角线为True
c=plt.get_cmap('RdBu')(np.linspace(0,1,27)).reshape(3,3,3,4)#ax3d.voxels(filled)             #filled为True的位置绘制六面体
ax3d.voxels(filled,facecolors=c) #filled为True的位置绘制六面体,并设置颜色plt.show()

图形如下:

6、数据来源

6.1 从文件加载数据

import matplotlib.pyplot as plt
import csv
import matplotlib as mplmpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=Falsex = []
y = []
with open('testData.txt','r') as csvfile:plots = csv.reader(csvfile, delimiter=',')for row in plots:x.append(int(row[0]))y.append(int(row[1]))
plt.plot(x,y, label='月销量趋势图')
plt.xlabel('x')
plt.ylabel('y')
plt.title('从文件中加载数据绘图')
plt.legend()
plt.show()

除了CSV 模块,也可以使用 NumPy 模块来加载我们的文件和数据

import matplotlib.pyplot as plt
import numpy as np
x, y = np.loadtxt('testData.txt', delimiter=',', unpack=True)
plt.plot(x,y, label='月销量趋势图')
plt.xlabel('x')
plt.ylabel('y')
plt.title('使用numpy从文件中加载数据绘图')
plt.legend()
plt.show()

6.2 从网络加载数据

我先用自己的服务器定义一个接口,接口回传的数据格式为:

data={'x':[1,2,3,4,5,6],'y':[2,5,8,9,13,19]}

然后我们访问接口,获得数据,再根据数据绘图:

import matplotlib.pyplot as plt
import requests
import matplotlib as mplmpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=Falseurl = '这里是API接口的地址'def get_data(url):response = requests.get(url)  data = response.json()  x=data['x']y=data['y']return x,yx,y=get_data()plt.plot(x,y, label='走势图')
plt.xlabel('x')
plt.ylabel('y')
plt.title('使用从网络接口获得的数据')
plt.legend()
plt.show()

最后图形如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149152.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

IntelliJ IDEA配置Cplex12.6.3详细步骤

Cplex12.6.3版IntelliJ IDEA配置详细步骤 一、Cplex12.6.3版下载地址二、Cplex安装步骤三、IDEA配置CPLEX3.1 添加CPLEX安装目录的cplex.jar包到项目文件中3.2 将CPLEX的x64_win64文件夹添加到IDEA的VM options中 四、检查IDEA中Cplex是否安装成功卸载Cplex 一、Cplex12.6.3版下…

Docker通过Dockerfile创建Redis、Nginx--详细过程

创建Nginx镜像 我们先创建一个目录,在目录里创建Dockerfile [rootdocker-3 ~]# mkdir mynginx [rootdocker-3 ~]# cd mynginx [rootdocker-3 ~]# vim Dockerfile Dockerfile的内容 FROM daocloud.io/library/centos:7 RUN buildDepsreadline-devel pcre-devel o…

代码:对鱼眼相机图像进行去畸变处理

图像投影模型:针孔[fx, fy, cx, cy] 图像畸变模型:切向径向畸变[k1, k2, p1, p2] 说明:用于备忘 第一部分是常规的去畸变操作,在已知内参的情况下对鱼眼相机进行去畸变,这里使用的是remap映射在对图像去畸变后&#x…

竞赛 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

Windows下启动freeRDP并自适应远端桌面大小

几个二进制文件 xfreerdp # Linux下的,an X11 Remote Desktop Protocol (RDP) client which is part of the FreeRDP project wfreerdp.exe # Windows下的,freerdp2.0 主程序,freerdp3.0将废弃 sdl-freerdp.exe # Windows下的&…

appscan的两种手动探索扫描方式

文章目录 一、使用火狐FoxyProxy浏览器代理探索二、使用appscan内置浏览器探索 一、使用火狐FoxyProxy浏览器代理探索 首先火狐浏览器需安装FoxyProxy 先在扩展和主题里搜FoxyProxy 选FoxyProxy Standard,然后添加到浏览器就行 添加后浏览器右上角会有这个插件 打开apps…

【算法学习】-【双指针】-【快乐数】

LeetCode原题链接:202. 快乐数 下面是题目描述: 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果…

cad图纸如何防止盗图(一个的制造设计型企业如何保护设计图纸文件)

在现代企业中,设计图纸是公司的重要知识产权,关系到公司的核心竞争力。然而,随着技术的发展,员工获取和传播设计图纸的途径越来越多样化,如何有效地防止员工复制设计图纸成为了企业管理的一大挑战。本文将从技术、管理…

【动手学深度学习-Pytorch版】Transformer代码总结

本文是纯纯的撸代码讲解,没有任何Transformer的基础内容~ 是从0榨干Transformer代码系列,借用的是李沐老师上课时讲解的代码。 本文是根据每个模块的实现过程来进行讲解的。如果您想获取关于Transformer具体的实现细节(不含代码)可…

MySQL的复合查询

文章目录 1. 多表查询2. 自连接3. 子查询3.1 单行子查询3.2 多行单列子查询3.3 单行多列子查询3.4 在from子句中使用子查询 4. 合并查询4.1 union all4.2 union 5. 内连接6. 外连接6.1 左外连接6.2 右外连接 1. 多表查询 前面我们讲解的mysql表的查询都是对一张表进行查询&…

哨兵(Sentinel-1、2)数据下载

哨兵(Sentinel-1、2)数据下载 一、登陆欧空局网站 二、检索 先下载2号为光学数据 分为S2A和S2B,产品种类有1C和2A,区别就是2A是做好大气校正的影像,当然数量也会少一些,云量检索条件中记得要按格式&#x…

Mind Map:大语言模型中的知识图谱提示激发思维图10.1+10.2

知识图谱提示激发思维图 摘要介绍相关工作方法第一步:证据图挖掘第二步:证据图聚合第三步:LLM Mind Map推理 实验实验设置医学问答长对话问题使用KG的部分知识生成深入分析 总结 摘要 LLM通常在吸收新知识的能力、generation of hallucinati…

一键AI高清换脸——基于InsightFace、CodeFormer实现高清换脸与验证换脸后效果能否通过人脸比对、人脸识别算法

前言 1、项目简介 AI换脸是指利用基于深度学习和计算机视觉来替换或合成图像或视频中的人脸。可以将一个人的脸替换为另一个人的脸,或者将一个人的表情合成到另一个人的照片或视频中。算法常常被用在娱乐目上,例如在社交媒体上创建有趣的照片或视频,也有用于电影制作、特效…

Qt model/view 理解01

在 Qt 中对数据处理主要有两种方式:1)直接对包含数据的的数据项 item 进行操作,这种方法简单、易操作,现实方式单一的缺点,特别是对于大数据或在不同位置重复出现的数据必须依次对其进行操作,如果现实方式改…

44 二叉搜索树中第K个小的元素

二叉搜索树中第K个小的元素 题解1 中序遍历题解2 AVL(手撕平衡二叉树:谢谢力扣官方) 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数&#xf…

再来介绍另一个binlog文件解析的第三方工具my2sql

看腻了文字就来听听视频演示吧:https://www.bilibili.com/video/BV1rp4y1w74B/ github项目:https://github.com/liuhr/my2sql gitee链接:https://gitee.com/mirrors/my2sql my2sql go版MySQL binlog解析工具,通过解析MySQL bin…

Maven 中引用其他项目jar包出现BOOT-INF问题

问题 在B项目中引入A项目的类,但是发现怎么也引入不进来 A项目打包之后,想在B项目中引用jar 在B项目中发现类文件无法引用 参考网上进行清缓存等一系列操作都没有解决。 最后发现引用的jar包中包含BOOT-INF, 然后去A项目中查找&#xff…

基于回溯搜索优化的BP神经网络(分类应用) - 附代码

基于回溯搜索优化的BP神经网络(分类应用) - 附代码 文章目录 基于回溯搜索优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.回溯搜索优化BP神经网络3.1 BP神经网络参数设置3.2 回溯搜索算法应用 4.测试结果…

基于MFC和OpenCV实现人脸识别

基于MFC和OpenCV实现人脸识别 文章目录 基于MFC和OpenCV实现人脸识别1. 项目说明1. 创建项目2. 启动窗口3. 登录窗口-添加窗口、从启动窗口跳转4. 启动窗口-美化按钮5. 登录窗口-美化按钮、雪花视频6. 注册窗口-美化按钮、雪花视频、从启动窗口跳转7. 注册窗口-开启摄像头8. 注…

大恒IFrameData IImageData转bmp HObject Mat

大恒工业相机采集的帧数据转为其他8bit图像格式 C#转为bmp格式转为Halcon的HObject格式转为OpenCVSharp的Mat格式 回调采集图像的数据类型为IFrameData,单帧采集的数据类型为IImageData,两者的区别为IImageData类多了一个**Destroy()**方法 C# 转为bm…