当前位置: 首页 > 编程日记 > 正文

Matplotlib基本用法

Matplotlib
Matplotlib 是Python中类似 MATLAB 的绘图工具,熟悉 MATLAB 也可以很快的上手 Matplotlib。

1. 认识Matploblib

1.1 Figure

在任何绘图之前,我们需要一个Figure对象,可以理解成我们需要一张画板才能开始绘图。

import matplotlib.pyplot as plt
fig = plt.figure()

1.2 Axes

在拥有Figure对象之后,在作画前我们还需要轴,没有轴的话就没有绘图基准,所以需要添加Axes。也可以理解成为真正可以作画的纸。

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',ylabel='Y-Axis', xlabel='X-Axis')
plt.show()

上的代码,在一幅图上添加了一个Axes,然后设置了这个Axes的X轴以及Y轴的取值范围(这些设置并不是强制的,后面会再谈到关于这些设置),效果如下图:
在这里插入图片描述

对于上面的fig.add_subplot(111)就是添加Axes的,参数的解释的在画板的第1行第1列的第一个位置生成一个Axes对象来准备作画。也可以通过fig.add_subplot(2, 2, 1)的方式生成Axes,前面两个参数确定了面板的划分,例如 2, 2会将整个面板划分成 2 * 2 的方格,第三个参数取值范围是 [1, 2*2] 表示第几个Axes。如下面的例子:

fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(224)

1.3 Multiple Axes

可以发现我们上面添加 Axes 似乎有点弱鸡,所以提供了下面的方式一次性生成所有 Axes:

fig, axes = plt.subplots(nrows=2, ncols=2)
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')

fig 还是我们熟悉的画板, axes 成了我们常用二维数组的形式访问,这在循环绘图时,额外好用。

1.4 Axes Vs .pyplot

相信不少人看过下面的代码,很简单并易懂,但是下面的作画方式只适合简单的绘图,快速的将图绘出。在处理复杂的绘图工作时,我们还是需要使用 Axes 来完成作画的。

plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)
plt.xlim(0.5, 4.5)
plt.show()

2. 基本绘图2D

2.1 线

plot()函数画出一系列的点,并且用线将它们连接起来。看下例子:

import matplotlib.pyplot as plt
import numpy as npfig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(224)x = np.linspace(0, np.pi)
y_sin = np.sin(x)
y_cos = np.cos(x)ax1.plot(x, y_sin)
ax2.plot(x, y_sin, 'go--', linewidth=2, markersize=12)
ax3.plot(x, y_cos, color='red', marker='+', linestyle='dashed')
plt.show()

在上面的三个Axes上作画。plot,前面两个参数为x轴、y轴数据。ax2的第三个参数是 MATLAB风格的绘图,对应ax3上的颜色,marker,线型。
在这里插入图片描述

另外,我们可以通过关键字参数的方式绘图,如下例:

import matplotlib.pyplot as plt
import numpy as npx = np.linspace(0, 10, 200)
data_obj = {'x': x,'y1': 2 * x + 1,'y2': 3 * x + 1.2,'mean': 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1}fig, ax = plt.subplots()#填充两条线之间的颜色
ax.fill_between('x', 'y1', 'y2', color='yellow', data=data_obj)# Plot the "centerline" with `plot`
ax.plot('x', 'mean', color='black', data=data_obj)plt.show()

Plot the “centerline” with plot

ax.plot('x', 'mean', color='black', data=data_obj)
plt.show()

发现上面的作图,在数据部分只传入了字符串,这些字符串对一个这 data_obj 中的关键字,当以这种方式作画时,将会在传入给 data 中寻找对应关键字的数据来绘图。
在这里插入图片描述

2.2 散点图

只画点,但是不用线连接起来。

x = np.arange(10)
y = np.random.randn(10)
plt.scatter(x, y, color='red', marker='+')
plt.show()

在这里插入图片描述

2.3 条形图

条形图分两种,一种是水平的,一种是垂直的,见下例子,
条形图还返回了一个Artists 数组,对应着每个条形,例如上图 Artists 数组的大小为5,我们可以通过这些 Artists 对条形图的样式进行更改,如下例:

import matplotlib.pyplot as plt
import numpy as npnp.random.seed(1)
x = np.arange(5)
y = np.random.randn(5)fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2))vert_bars = axes[0].bar(x, y, color='lightblue', align='center')
horiz_bars = axes[1].barh(x, y, color='lightblue', align='center')
#在水平或者垂直方向上画线
axes[0].axhline(0, color='gray', linewidth=2)
axes[1].axvline(0, color='gray', linewidth=2)fig, ax = plt.subplots()
vert_bars = ax.bar(x, y, color='lightblue', align='center')# We could have also done this with two separate calls to `ax.bar` and numpy boolean indexing.
for bar, height in zip(vert_bars, y):if height < 0:bar.set(edgecolor='darkred', color='salmon', linewidth=3)plt.show()

在这里插入图片描述

2.4 直方图
直方图用于统计数据出现的次数或者频率,有多种参数可以调整,见下例:

import matplotlib.pyplot as plt
import numpy as npnp.random.seed(19680801)n_bins = 10
x = np.random.randn(1000, 3)fig, axes = plt.subplots(nrows=2, ncols=2)
ax0, ax1, ax2, ax3 = axes.flatten()colors = ['red', 'tan', 'lime']
ax0.hist(x, n_bins, density=True, histtype='bar', color=colors, label=colors)
ax0.legend(prop={'size': 10})
ax0.set_title('bars with legend')ax1.hist(x, n_bins, density=True, histtype='barstacked')
ax1.set_title('stacked bar')ax2.hist(x,  histtype='barstacked', rwidth=0.9)ax3.hist(x[:, 0], rwidth=0.9)
ax3.set_title('different sample sizes')fig.tight_layout()
plt.show()

参数中density控制Y轴是概率还是数量,与返回的第一个的变量对应。histtype控制着直方图的样式,默认是 ‘bar’,对于多个条形时就相邻的方式呈现如子图1, ‘barstacked’ 就是叠在一起,如子图2、3。 rwidth 控制着宽度,这样可以空出一些间隙,比较图2、3. 图4是只有一条数据时。
在这里插入图片描述

2.5 饼图
饼图自动根据数据的百分比画饼.。labels是各个块的标签,如子图一。autopct=%1.1f%%表示格式化百分比精确输出,explode,突出某些块,不同的值突出的效果不一样。pctdistance=1.12百分比距离圆心的距离,默认是0.6.

import matplotlib.pyplot as plt
import numpy as nplabels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)  # only "explode" the 2nd slice (i.e. 'Hogs')fig1, (ax1, ax2) = plt.subplots(2)
ax1.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=True)
ax1.axis('equal')
ax2.pie(sizes, autopct='%1.2f%%', shadow=True, startangle=90, explode=explode,pctdistance=1.12)
ax2.axis('equal')
ax2.legend(labels=labels, loc='upper right')plt.show()

在这里插入图片描述

2.6 箱形图
为了专注于如何画图,省去数据的处理部分。

import matplotlib.pyplot as plt
import numpy as npimport matplotlib.pyplot as plt
import numpy as np
all_data=[np.random.normal(0,std,100) for std in range(1,4)]figure,axes=plt.subplots() #得到画板、轴
axes.boxplot(all_data,patch_artist=True) #描点上色
plt.show() #展示

在这里插入图片描述

3 布局、图例说明、边界等

3.1区间上下限

当绘画完成后,会发现X、Y轴的区间是会自动调整的,并不是跟我们传入的X、Y轴数据中的最值相同。为了调整区间我们使用下面的方式,具体效果见下例:

import matplotlib.pyplot as plt
import numpy as npfig, ax = plt.subplots()xmin =1
xmax=10
ymin=0
ymax=1
ax.set_xlim([xmin, xmax])   #设置X轴的区间
ax.set_ylim([ymin, ymax])   #Y轴区间
ax.axis([xmin, xmax, ymin, ymax])   #X、Y轴区间
ax.set_ylim(bottom=-10)     #Y轴下限
ax.set_xlim(right=25)       #X轴上限x = np.linspace(0, 2*np.pi)
y = np.sin(x)
fig, (ax1, ax2) = plt.subplots(2)
ax1.plot(x, y)
ax2.plot(x, y)
ax2.set_xlim([-1, 6])
ax2.set_ylim([-1, 3])
plt.show()

可以看出修改了区间之后影响了图片显示的效果。
在这里插入图片描述

3.2 图例说明

我们如果我们在一个Axes上做多次绘画,那么可能出现分不清哪条线或点所代表的意思。这个时间添加图例说明,就可以解决这个问题了,见下例:

import matplotlib.pyplot as plt
import numpy as npfig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')
ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')
ax.scatter([1, 2, 3, 4], [20, 10, 30, 15], label='Point')
ax.set(ylabel='Temperature (deg C)', xlabel='Time', title='A tale of two cities')
ax.legend()
plt.show()

在这里插入图片描述

在绘图时传入 label 参数,并最后调用ax.legend()显示体力说明,对于 legend 还是传入参数,控制图例说明显示的位置:

Location String	Location 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

3.3 区间分段

默认情况下,绘图结束之后,Axes 会自动的控制区间的分段。见下例:
在这里插入图片描述

上面不仅修改了X轴的区间段,并且修改了显示的信息为文本。

import matplotlib.pyplot as plt
import numpy as npdata = [('apples', 2), ('oranges', 3), ('peaches', 1)]
fruit, value = zip(*data)fig, (ax1, ax2) = plt.subplots(2)
x = np.arange(len(fruit))
ax1.bar(x, value, align='center', color='gray')
ax2.bar(x, value, align='center', color='gray')ax2.set(xticks=x, xticklabels=fruit)#ax.tick_params(axis='y', direction='inout', length=10) #修改 ticks 的方向以及长度plt.show()

3.4 布局

当我们绘画多个子图时,就会有一些美观的问题存在,例如子图之间的间隔,子图与画板的外边间距以及子图的内边距,下面说明这个问题:

import matplotlib.pyplot as plt
import numpy as npfig, axes = plt.subplots(2, 2, figsize=(9, 9))
fig.subplots_adjust(wspace=0.5, hspace=0.3,left=0.125, right=0.9,top=0.9,    bottom=0.1)#fig.tight_layout() #自动调整布局,使标题之间不重叠plt.show()

通过fig.subplots_adjust()我们修改了子图水平之间的间隔wspace=0.5,垂直方向上的间距hspace=0.3,左边距left=0.125 等等,这里数值都是百分比的。以 [0, 1] 为区间,选择left、right、bottom、top 注意 top 和 right 是 0.9 表示上、右边距为百分之10。不确定如果调整的时候,fig.tight_layout()是一个很好的选择。之前说到了内边距,内边距是子图的,也就是 Axes 对象,所以这样使用 ax.margins(x=0.1, y=0.1),当值传入一个值时,表示同时修改水平和垂直方向的内边距。
在这里插入图片描述

观察上面的四个子图,可以发现他们的X、Y的区间是一致的,而且这样显示并不美观,所以可以调整使他们使用一样的X、Y轴:
在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as npfig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)
ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])
ax2.plot([3, 4, 5, 6], [6, 5, 4, 3])
plt.show()

3.5 轴相关

改变边界的位置,去掉四周的边框:

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as npfig, ax = plt.subplots()
ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])
ax.spines['top'].set_visible(False)     #顶边界不可见
ax.xaxis.set_ticks_position('bottom')  # ticks 的位置为下方,分上下的。
ax.spines['right'].set_visible(False)   #右边界不可见
ax.yaxis.set_ticks_position('left')  # "outward"
# 移动左、下边界离 Axes 10 个距离
#ax.spines['bottom'].set_position(('outward', 10))
#ax.spines['left'].set_position(('outward', 10))# "data"
# 移动左、下边界到 (0, 0) 处相交
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))# "axes"
# 移动边界,按 Axes 的百分比位置
#ax.spines['bottom'].set_position(('axes', 0.75))
#ax.spines['left'].set_position(('axes', 0.3))plt.show()

在这里插入图片描述

4. reference

https://zhuanlan.zhihu.com/p/38199913
https://guoqiang.blog.csdn.net/article/details/122522093
https://blog.csdn.net/qq_34859482/article/details/80617391

相关文章:

HDU1201 18岁生日【日期计算】

18岁生日 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 32851 Accepted Submission(s): 10649Problem DescriptionGardon的18岁生日就要到了&#xff0c;他当然很开心&#xff0c;可是他突然想到一个问题&am…

TypeScript 从听说到入门(上篇)

我为什么会这样念念又不忘 / 你用什么牌的箭刺穿我心脏 我也久经沙场 / 戎马生涯 / 依然 / 被一箭刺伤 ——李荣浩《念念又不忘》 接下来我会分上、下两篇文章介绍 TypeScript。 我也是 TypeScript 初学者&#xff0c;这两篇文章是我的学习笔记&#xff0c;来源于一个系列的免费…

SLAM前端中的视觉里程计和回环检测

1. 通常的惯例是把 VSLAM 分为前端和后端。前端为视觉里程计和回环检测&#xff0c;相当于是对图像数据进行关联&#xff1b;后端是对前端输出的结果进行优化&#xff0c;利用滤波或非线性优化理论&#xff0c;得到最优的位姿估计和全局一致性地图。 1 前端&#xff1a;图像数…

粗心导致的bug

不管是调试程序还是直接看输出i都为2&#xff0c;下面是运行时输出的&#xff1a; 用vs2010以前遇到更奇葩的事&#xff0c;这次用vs2013也是遇到奇葩&#xff0c;taskNumber值为2一定&#xff0c;下面两个循环体&#xff0c;每个循环体各执行一次&#xff0c;程序输出i 2真是…

gearman中任务的优先级和返回状态

gearman中任务的优先级和返回状态 一、任务的优先级 同步阻塞调用&#xff0c;等待返回结果 doLow:最低优先 doNomal:正常优先级 doHigh:最优先执行 异步派发任务&#xff0c;不等待返回结果&#xff0c;返回任务句柄&#xff0c;通过该句柄可获取任务运行状态信息 doLowBackgr…

VMware学习使用笔记

本人在学习基础上&#xff0c;结合实际项目实现总结的笔记。以下内容都是基于VMware vSphere 6.7的官方文档中vSAN的规划和部署而来&#xff0c;网址https://docs.vmware.com/cn/VMware-vSphere/index.html。 对于ESXi系统 对于内存不足512G&#xff0c;可以从USB或Micro SD引导…

【原】Java学习笔记020 - 面向对象

1 package cn.temptation;2 3 public class Sample01 {4 public static void main(String[] args) {5 // 成员方法的参数列表&#xff1a;6 // 1、参数列表中的数据类型是值类型7 // 2、参数列表中的数据类型是引用类型8 // A&#xff1a;…

win32 wmi编程获取系统信息

//GetSysInfo.h#pragma once#include <afxtempl.h>class GetSysInfo { public:GetSysInfo(void);~GetSysInfo(void);public: /********获取操作系统版本&#xff0c;Service pack版本、系统类型************/ void GetOSVersion(CString &strOSVersion,CString &…

cmake 注意事项

1. add_subdirectory()调用 CMake将在每次add_subdirectory()调用时创建一个新的变量作用域,因此这个参数最好的用法是放在cmaklists的最后使用&#xff0c;这样的话创建的新的变量的作用范围与内存的变化就不会影响到后面的变量的使用。 查看并打印在cmake里面定义的宏在&am…

Jmeter 使用自定义变量

有些情况下比如发起测试时URL的主机名和端口需要在采样器中出现多次&#xff0c;这样就有个问题&#xff0c;当测试的主机更改时&#xff0c; 我们需要修改主机名称&#xff0c;这时就需要修改多个地方&#xff0c;如果多的情况会有遗漏。如果我们在配置脚本的时候&#xff0c;…

Kubernetes1.5源码分析(二) apiServer之资源注册

源码版本 Kubernetes v1.5.0 简介 k8s里面有各种资源&#xff0c;如Pod、Service、RC、namespaces等资源&#xff0c;用户操作的其实也就是这一大堆资源。但这些资源并不是杂乱无章的&#xff0c;使用了GroupVersion的方式组织在一起。每一种资源都属于一个Group&#xff0c;而…

opencv3 视频稳像

OpneCV3.x中提供了专门应用于视频稳像技术的模块&#xff0c;该模块包含一系列用于全局运动图像估计的函数和类。结构体videostab::RansacParams实现了RANSAC算法&#xff0c;这个算法用来实现连续帧间的运动估计。videostab::MotionEstimatorBase是基类中所有全局运动估计方法…

perf+火焰图 = 性能分析利器

perf 1. perf安装 sudo apt install linux-tools-common检查是否安装好 perf如果出现 You may need to install the following packages for this specific kernel:推荐安装可以按照提示将推荐安装包全部安装好 sudo apt-get install linux-tools-对应版本-generic linux-c…

3- MySQL数据类型

MySQL表字段类型 MySQL数据表的表示一个二维表&#xff0c;由一个或多个数据列构成。 每个数据列都有它的特定类型&#xff0c;该类型决定了MySQL如何看待该列数据&#xff0c;并且约束列存放相应类型的数据。 MySQL中的列表有三种&#xff1a;数值类&#xff0c;字符串类和日期…

AddressSanitizer+cmake

1. AddressSanitizercmake(Linux) 编译指令&#xff1a; CXXFLAGS通常需要加上 -fsanitizeaddress -fno-omit-frame-pointer #打印函数调用路径 -fsanitize-recoveraddress #AddressSanitizer遇到错误时能够继续-fsanitizeaddress-fno-omit-frame-pointer-fsanitize-rec…

vibe前景提取改进算法

// improveVibeAlgorithm.h #ifndef IMPROVED_VIBE_ALGORITHM_H #define IMPROVED_VIBE_ALGORITHM_H#include <opencv2/opencv.hpp> using namespace std;#define WINSIZE 5 // Vibe改进算法, Barnich, Olivier & Droogenbroeck, Marc. (2009). // ViBE: A powerfu…

npm-debug.log文件出现原因

项目主目录下总是会出现这个文件&#xff0c;而且不止一个&#xff0c;原因是npm i 的时候&#xff0c;如果报错&#xff0c;就会增加一个此文件来显示报错信息&#xff0c;npm install的时候则不会出现。转载于:https://www.cnblogs.com/liuna/p/6558006.html

AutoFac Ioc依赖注入容器

本文原著&#xff1a;牛毅 原文路径 http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ 理解IOC容器请看下图&#xff1a; 没有使用IOC容器的情况下: 使用IOC容器的情况下&#xff1a; 去掉IOC容器的情况后&#xff1a; IOC容器又像一个插座&#xff0c;将电输送…

Linux安装App记录

Ubuntu18.04安装微信

windows socket编程入门示例3

// Lock.h #ifndef _Lock_H #define _Lock_H #include <windows.h>class CriticalSection { private:CRITICAL_SECTION g_cs; //临界区 public:CriticalSection();~CriticalSection();void Lock();void UnLock(); }; #endif// Lock.cpp #include "Lock.h"…

游戏开发:js实现简单的板球游戏

js实现简单的板球游戏大家好&#xff0c;本次我们来使用js来实现一个简单的板球游戏。截图如下&#xff1a;首先&#xff0c;设计页面代码&#xff0c;页面代码很简单&#xff0c;因为整个几乎是使用js编写的&#xff0c;页面几乎没有代码&#xff0c;如下&#xff1a;<!DOC…

SLAM精度测评——EVO进阶

1. 基本概念 1.1 Umeyama算法 ATE&#xff1a; evo_ape tum state_groundtruth_estimate0/data.tum orb2/CameraTrajectory.txt -r trans_part -va --plot --plot_mode xy --save_results /home/sun/evo/v1_01_easy/orb2/ate.zip RPE&#xff1a; evo_rpe tum state_groun…

python读取图片并且显示

使用python-opencv读取图片&#xff0c;利用opencv或matplotlib显示图片。 # -*- coding: utf-8 -*-import numpy as np from matplotlib import pyplot as plt #import urllib import cv2def load_image1(file):# Load an color image in grayscaleimg cv2.imread(file,0)cv…

shiro认证

shiro权限认证&#xff1a; 具体的认证流程是这样的&#xff1a; 一般流程&#xff1a; 通过.ini的文件来初始化工厂&#xff0c;.ini的文件的好处是可以创建多个组&#xff0c;而.properties的文件只能创建一组。 系统默认有shiro.ini的文件&#xff0c;但是一般我们是自定义数…

小猿圈Linux基础面试题,看看你能答对几道?

最近身边的很多朋友都在学习linux&#xff0c;从最开始的安装软件都需要百度一天的他们&#xff0c;现在已经成长为了&#xff0c;不需要百度就可以把自己弄懵圈的了&#xff0c;接下来的几天小猿圈linux老师会为大家准备一些实用的linux技巧分析给大家&#xff0c;希望对你有所…

ORB-SLAM2 论文翻译

https://ug98gs7tbw.feishu.cn/docs/doccnKKOWAjkKv7AzAiEvbnM3Tf

mxnet教程1

import mxnet as mx #%matplotlib inline import os import subprocess import numpy as np import matplotlib.pyplot as plt import tarfileimport warnings warnings.filterwarnings("ignore", categoryDeprecationWarning)# 从内存中读取数据 def test1():data …

番外:Spring MVC环境搭建和Mybatis配置避坑篇

2019独角兽企业重金招聘Python工程师标准>>> web.xml引入对spring mvc的支持&#xff1b; spring-mvc配置spring-mvc&#xff1b; spring-mybatis配置mybatis支持&#xff0c;并指名mapper文件的位置&#xff1b; mybaits-config配置mybatis&#xff1b; jdbc.prope…

50个云终端只需一台服务器是怎么一回事

看到这个标题也许有人会说50个云终端只需要一台服务器这应该是不可能的吧&#xff0c;即使是真的那这个服务器的配置和价格应该也要非常高的吧。但是如果有人和你说50个云终端只需要一台中等配置和价格的服务器就可以的呢。而且这50个用户桌面都可以正常的使用不会出现卡顿等现…

SLAM学习,小白入门到殿堂级大牛资料整理

总结一下我接触过的SLAM算法吧,主要集中在visual slam: 特征法: ORB SLAM https://github.com/raulmur/ORB_SLAM2优势: 在静态环境下定位准确,稳定, 单目和双目版本都可以达到实时(高于10frames/s)。代码可读性强,易扩展, 网上也有实现和imu融合的版本。 劣势:建的地图…