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

news2024/12/22 20:13:06

        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简写成 plt

mpl.rcParams['font.family']='Kaiti'          #设定中文字体为楷体
plt.rcParams['axes.unicode_minus']=False     #


plt.figure(figsize=(300,200))      #设定画布大小为300*200

x = [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 np

mpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=False


plt.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 plt

mpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=False

import 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 plt

mpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=False

x=[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 np

mpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=False
 
x = 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 np

mpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=False

import 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 np

zuobiao1 = 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 np



style.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 plt

fig = 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 mpl


mpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=False

x = []
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 mpl

mpl.rcParams['font.family']='Kaiti'
plt.rcParams['axes.unicode_minus']=False


url = '这里是API接口的地址'

def get_data(url):
    
    response = requests.get(url)  
    data = response.json()  

    x=data['x']
    y=data['y']

    return x,y


x,y=get_data()


plt.plot(x,y, label='走势图')
plt.xlabel('x')
plt.ylabel('y')
plt.title('使用从网络接口获得的数据')
plt.legend()
plt.show()

最后图形如下:

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

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

相关文章

UGUI交互组件Toggle

一.Toggle对象的构造 Toggle和Button类似,是交互组件的一种 如果所示,通过菜单创建了两个Toggle,Toggle2中更换了背景和标记资源 对象说明Toggle含有Toggle组件的对象Background开关背景Checkmark开关选中标记Label名称文本 二.Toggle组件属…

基于Spring Boot的中小型医院网站的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 前台首页界面 用户登录界面 用户注册界面 门诊信息详情界面 预约挂号界面 药品详情界面 体检报告界面 管理员登录界面 用户管理界面 医师管理界面 科室类型管理界面 门诊信息管理界面 药库信息管理界面 预约挂号管理界面…

计算机网络基础(一):网络系统概述、OSI七层模型、TCP/IP协议及数据传输

通信,在古代是通过书信与他人互通信息的意思。 今天,“通信”这个词的外沿已经得到了极大扩展,它目前的大意是指双方或多方借助某种媒介实现信息互通的行为。 如果按照当代汉语的方式理解“通信”,那么古代的互遣使节、飞鸽传书…

番外12:连续类功率放大器理论-连续类实现带宽拓展的底层原理

连续类功放通解:连续类功率放大器理论-连续类实现带宽拓展的底层原理-基础 本次内容理论性较强,适合对功率放大器理论研究比较感兴趣以及想发论文的小朋友,着重探讨现有的一些带宽拓展模式(也就是连续类)的基本实现原…

MATLAB算法实战应用案例精讲-【优化算法】火烈鸟搜索优化算法(FSA)(附python代码实现)

前言 火烈鸟搜索算法(flamingo search algorithm,fsa)是一种模拟火烈鸟群体觅食行为的新型智能优化算法,可以用于路径规划领域。根据fsa的寻优过程可知,fsa存在以下不足:(1)初始化种群位置是随机的,不能保证种群质量;(2)在个体的迭代更新过程中缺少变异机制,导致种群多…

XFTP上传文件状态出现错误的原因和解决方案

这几天有时候会出现XFTP会出现上传的时候状态出现错误的情况,我没那么在意,但是今天要传比较重要的东西,结果没办法传,我参考了这个方法,但是感觉修改用户组的权限是正确的可能解释的没那准确 之后我是直接把XFTP的登陆…

【LeetCode热题100】--74.搜索二维矩阵

74.搜索二维矩阵 按行搜索,使用二分查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int[] row : matrix){int index search(row,target);if(index > 0){return true;}}return false;}public int search(int[] nums,int t…

【C++入门到精通】C++入门 —— AVL 树(自平衡二叉搜索树)

阅读导航 前言一、AVL树的概念二、AVL树节点的定义三、AVL树的插入四、AVL树的旋转(重点)1. 右单旋(新节点插入较高左子树的左侧)2. 左单旋(新节点插入较高右子树的右侧)3. 先左单旋再右单旋(新…

Kafka安装记录

目录 安装依赖 安装zookeeper 可能遇到的报错 下载安装包 解压 修改配置 其他相关配置 修改日志的位置 修改Zookeeper 启动 测试 创建主题 查看主题 插入数据 查看数据量 消费数据 删除主题 安装依赖 由于Kafka是用Scala语言开发的,运行在JVM上&am…

Elasticsearch安装访问

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎,设计用于云计算环境中,能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性,可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

C++人事管理系统

一、设计目的 企业员工管理系统主要是针对企业员工的基本信息进行增、删、改、查的相关操作,以便用户使用本管理系统时可以快速对企业员工的信息进行管理。 二、设计内容 1.用户首次使用本系统时进行密码设置和初始化操作。 2.实现添加功能,即添加员工…

计算机竞赛 身份证识别系统 - 图像识别 深度学习

文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 图像识别 深度学习 身份证识别…

【算法训练-二分查找 四】【模拟二分】X的平方根

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【二分查找】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

stm32-SPI协议

SPI协议详解(图文并茂超详细) SPI通讯协议 于是我们想有没有更好一点的串行通讯方式;相比较于UART,SPI的工作方式略有不同。 SPI是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和…

Django的模版使用(Django-03)

一 模版的使用 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了 把前端代码和服务端代码分离 的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。 静态网页&…

Linux文本三剑客---awk

AWK是什么 Linux文本三剑客之一(grep,sed,awk),功能最强大的文本工具。 逐行读取输入的文本内容,默认以空格和tab键作为分隔符。但是多个空格或者tab键的空格,会自动压缩成一个,然后按照指定的模式和条件执…

3D 毛玻璃晶质见证卡

效果展示 页面结构 从上面的效果展示来看,页面主要成员是一张卡片,并且卡片上有三个小矩形,而小矩形上会展示对应的内容。 当鼠标悬停在卡片上时,卡片会随着鼠标的移动而改变视角。 CSS3 知识点 transform-style 属性的 prese…

用OpenCV(Python)获取图像的SIFT特征

import cv2 as cv import numpy as np import matplotlib.pyplot as plt imgcv.imread("../Lena.png") img_graycv.cvtColor(img,cv.COLOR_BGR2GRAY)#创建一个SIFI对象 siftcv.SIFT_create()#使用SIFT对象在灰度图像img_gray中检测关键点,结果存储在变量k…

MATLAB中plot3函数用法

目录 语法 说明 向量和矩阵数据 表数据 其他选项 示例 绘制三维螺旋图 绘制多个线条 使用矩阵绘制多个线条 指定等间距刻度单位和轴标签 将点绘制为不带线的标记 自定义颜色和标记 指定线型 在绘图后修改线条 绘制表中的数据 在 x 和 y 轴上绘制多个表变量 指…

【国漫逆袭】人气榜,小医仙首次上榜,霍雨浩排名飙升,不良人热度下降

Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 为了提升作品和角色的讨论度,增加平台的用户活跃度,小企鹅推出了动漫角色榜,该榜单以【年】【周】【日】为单位,通过角色的点赞量和互动量进行排名 上周的动漫角…