matplotlib可视化:基础绘图函数使用【函数功能+案例代码】
系列文章目录
可视化:基础绘图函数使用【函数功能+案例代码】
可视化:基础图像绘制
可视化:局部放大折线图+阴影区间绘制【原理+代码】
文章目录 2.3 绘制子图 2.4 网格设置grid()2.5 坐标轴设置 2.6 字体设置问题2.7 文本和箭头设置
前言
由于毕设写论文需要绘图,记录一下学习笔记。
一、简介
首先附上官网链接:官网链接
下载:
pip install matplotlib
由三个层次结构组成:脚本层、美工层和后端层。
二、基础函数用法 2.1 图形对象
通过plt.创建一个画布对象;函数的参数值如下:
参数说明
指定画布的大小,(宽度,高度),单位为英寸。
dpi
指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。
背景颜色。
边框颜色。
是否显示边框。
示例如下:
import matplotlib.pyplot as plt
import numpy as np
import math#数据
x = np.arange(0, math.pi*2, 0.05)
y = np.sin(x)
#创建一个画布对象fig
fig=plt.figure(figsize=(10,10),dpi=100,facecolor='#B6D6F0',edgecolor='black',frameon=True)
"""
# figsize 指定画布的大小,(宽度,高度),单位为英寸。
# dpi 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。
# facecolor 背景颜色。
# edgecolor 边框颜色。
# frameon 是否显示边框。
"""
#绘制坐标轴的范围
#add_axes() 的参数值是一个序列,序列中的 4 个数字分别对应图形的左侧,底部,宽度,和高度,且每个数字必须介于 0 到 1 之间。
ax=fig.add_axes([0.3,0.3,0.5,0.5])
#设置x轴,y轴标签
ax.set_xlabel("angle")
ax.set_ylabel("sin(x)")
#设置图像标题
ax.set_title("y=sin(x)")
#绘制图像
ax.plot(x,y)
#展示图象
plt.show()
2.2 axes类使用
定义了 axes 类,该类的对象被称为 axes 对象。它指定了一个有数值范围限制的绘图区域。在一个给定的中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。
2.2.1 创建axes对象
ax=fig.add_axes([0.1,0.1,0.8,0.8])
将画布的宽、高作为 1 个单位。比如,[ 0.1, 0.1, 0.8, 0.8],它代表着从画布 10% 的位置开始绘制, 宽高是画布的 80%。
2.2.2 axes.()绘制图例
axes的方法可以绘制图例,方法如下:
ax.legend(labels, loc)
其中, 是一个字符串序列,用来指定标签的名称;loc 是指定图例位置的参数,其参数值可以用字符串或整数来表示,可选位置参数如下:
位置字符串表示整数数字表示
自适应
best
右上方
upper right
左上方
upper left
左下
lower left
右下
lower right
右侧
right
居中靠左
left
居中靠右
right
底部居中
lower
上部居中
upper
中部
10
举例:
ax.legend(labels = ('tv', 'Smartphone'), loc = 'lower right')
同时可以修改图例的大小:
ax.legend(prop = {'size':6})
还可以自定义图例的位置:(0,0)表示的是图的左下角,坐标的数值表示的是比例。
plt.legend(bbox_to_anchor=(0.3,0.5))
图例的样式也可以调整,默认的图例样式是竖排的。比如我们有两个图例,那么我们设置下面这个为2,就是默认并排展示,而不是并列展示
legend(ncol=2)
2.2.3 axes.plot()绘制图像
plot函数的可选参数主要用于设置线条类型,颜色,标记。
颜色标识颜色类型标记符号标记描述线型线型描述
‘b’
蓝色
‘.’
点标记
‘-’
实线
‘g’
绿色
‘o’
圆圈标记
‘–’
虚线
‘r’
红色
‘x’
'X’标记
‘-.’
点划线
‘c’
青色
‘H’
六角标记
‘:’
虚线
‘m’
品红色
‘s’
正方形标记
‘H’
六角标记
‘y’
黄色
‘+’
加号标记
‘k’
黑色
‘D’
钻石标记
‘w’
白色
对于axes类的方法使用,示例代码如下:
import matplotlib.pyplot as plt#创建画布
fig=plt.figure(dpi=100)
#创建axes
ax=fig.add_axes([0.1,0.1,0.8,0.8])
#绘图
ax.plot([1,2,3,4],[1,3,6,9],'ro-')
ax.plot([1,2,3,4],[2,5,8,12],'bH-.')
#设置图例
ax.legend(labels=('twitter','weibo'), loc='best')
#设置坐标轴
ax.set_xlabel("time")
ax.set_ylabel("visit")
#设置图像标题
ax.set_title("compare")
#展示图片
plt.show()
同时参数可以设置线型,可以设置线宽。
在一个画布里面可以拥有多个ax对象,示例代码如下:
fig=plt.figure(dpi=100)ax1,ax2=fig.add_axes([0.1,0.1,0.8,0.8]),fig.add_axes([0.58,0.15,0.26,0.26])#绘制第一个图像ax1.plot([1,2,3,4],[3,5,7,10],'bD-')ax1.plot([1,2,3,4],[2,6,8,14],'r+:')ax1.set_xlabel("time")ax1.set_ylabel("count")ax1.set_title("graph-one")ax1.legend(labels=['line1','line2'],loc='best')#绘制第二个图象ax2.plot([1,2,3,4],[3,5,7,10],'rD-')ax2.plot([1,2,3,4],[2,6,8,14],'b+:')ax2.set_xlabel("time")ax2.set_ylabel("count")ax2.set_title("graph-two")ax2.legend(labels=['line1','line2'],loc='best')plt.show()
2.3 绘制子图 2.3.1 ()函数
() 既创建了一个包含子图区域的画布,又创建了一个 图形对象:
fig , ax = plt.subplots(nrows, ncols)
nrows 与 ncols 表示两个整数参数,它们指定子图所占的行数、列数。返回值是一个元组,包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols,且每个 axes 对象均可通过索引值访问(从1开始)。
示例:
import matplotlib.pyplot as plt
import numpy as np
import math#创建画布和多个子图axes
fig,ax=plt.subplots(2,2)
fig.figsize=(8,6)
#x轴数据
x=np.arange(1,10,1)
#对多个子图进行绘制
ax[0][0].plot(x,np.sin(x))
ax[0][0].set_title("y=sin(x)")ax[0][1].plot(x,np.cos(x))
ax[0][1].set_title("y=cos(x)")ax[1][0].plot(x,np.log(x))
ax[1][0].set_title("y=log(x)")ax[1][1].plot(x,np.exp(x))
ax[1][1].set_title("y=exp(x)")
#展示图像
plt.show()
2.3.2 ()函数
() 函数以非等分的形式对画布进行切分,并按照绘图区域的大小来展示最终绘图结果。
plt.subplot2grid(shape, location, rowspan, colspan)
参数含义如下:
import matplotlib.pyplot as plt
import numpy as npa1 = plt.subplot2grid((3,3),(0,0),colspan=3)
a2 = plt.subplot2grid((3,3),(1,0), rowspan = 2)
a3 = plt.subplot2grid((3,3),(1,1),rowspan = 2, colspan = 2)x = np.arange(1,10)
a2.plot(x, x*x)
a2.set_title('square')
a1.plot(x, np.exp(x))
a1.set_title('exp')
a3.plot(x, np.log(x))
a3.set_title('log')
plt.tight_layout()
plt.show()
2.4 网格设置grid()
grid() 方法可以开启或者关闭画布中的网格(即是否显示网格)以及网格的主/次刻度;设置网格的颜色、线型以及线宽等属性。
grid(color='b', ls = '-.', lw = 0.25)
示例代码如下:
import matplotlib.pyplot as plt
import numpy as np
#数据源
x = np.arange(1,11)
#创建画布和子图
fig,ax=plt.subplots(1,3,figsize=(9,3))
#设置子图
ax[0].plot(x,x**2,'bo-')
ax[0].set_title("y=x^2")
ax[0].set_xlabel("x")
ax[0].set_ylabel("x^2")
ax[0].grid(color='b', ls = '-.', lw = 0.25)ax[1].plot(x,x**3,'rH-.')
ax[1].set_title("y=x^3")
ax[1].set_xlabel("x")
ax[1].set_ylabel("x^3")
ax[1].grid(color='k', ls = '-', lw = 0.15)ax[2].plot(x,x*2,'mD:')
ax[2].set_title("y=x*2")
ax[2].set_xlabel("x")
ax[2].set_ylabel("x*2")
ax[2].grid(color='r', ls = ':', lw = 0.35)plt.tight_layout()
plt.show()
2.5 坐标轴设置 2.5.1 对数刻度设置
在数据范围广的时候,往往采用对数刻度,代码如下:
ax.xscale("log")或ax.yscale("log")
示例代码
import matplotlib.pyplot as plt
import numpy as np#数据
x = np.arange(1,9,1)
#创建画布和子图
fig, ax = plt.subplots(1, 2, figsize=(10,4))
#绘图
ax[0].plot(x,x)
ax[0].set_title("Normal scale")
ax[0].set_xlabel("x axis")
ax[0].set_ylabel("y axis")ax[1].set_yscale("log")
ax[1].plot(x,x)
ax[1].set_title("Logarithmic scale (y)")
ax[1].set_xlabel("x axis")
ax[1].set_ylabel("y axis")plt.tight_layout()
plt.show()
2.5.2 坐标轴颜色,线宽设置
通过ax.获取坐标轴字典,坐标轴包括4个:上下左右。可以通过,设置颜色和线宽。示例代码如下:
fig = plt.figure()ax = fig.add_axes([0.2, 0.2, 0.7, 0.7])ax.spines['bottom'].set_color('red')ax.spines['left'].set_linewidth(2)ax.spines['right'].set_color(None)ax.spines['top'].set_color(None)ax.plot([1, 2, 3, 4, 5])plt.show()
2.5.3 坐标轴范围
通过,实现。
#设置y轴
a1.set_ylim(0,10000)
#设置x轴
a1.set_xlim(0,10)
2.5.4 坐标轴刻度,刻度标签
对于坐标轴的刻度,通过或实现;对于坐标轴的刻度标签,在设置好坐标轴刻度的前提下,将标签与刻度一一对应,采用或进行设置。示例代码如下:
#数据x = np.arange(0, math.pi * 2, 0.05)#生成画布对象fig = plt.figure()# 添加绘图区域ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])#绘图ax.plot(x, np.sin(x))#设置x轴标签ax.set_xticks([0, 2, 4, 6])# 设置x轴刻度标签ax.set_xticklabels(['zero', 'two', 'four', 'six'])# 设置y轴刻度ax.set_yticks([-1, 0, 1])plt.show()
同时,通过plt.(=7)可以设置标签刻度的字体大小。
或者plt.(‘y’,=“#”)可以设置标签的颜色和更改坐标轴类型。
2.6 字体设置问题
一般论文采用中文宋体和英文Times New Roman字体,参考博客:字体设置进行了字体设置。
【方法一】
def draw01():plt.rcParams['font.sans-serif'] = ['SongNTR'] ##设置字体plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题year = [2017, 2018, 2019, 2020]people = [20, 40, 60, 70]#生成图表plt.plot(year, people)plt.xlabel('年份')plt.ylabel('人口')plt.title('人口增长-1')#设置纵坐标刻度plt.yticks([0, 20, 40, 60, 80])#显示图表plt.show()
【方法二】
def draw02():plt.rcParams['font.sans-serif'] = ['Times New Roman']plt.rcParams['axes.unicode_minus'] = Falseyear = [2017, 2018, 2019, 2020]people = [20, 40, 60, 70]#生成图表plt.plot(year, people)plt.xlabel('年份',fontproperties='simsun')plt.ylabel('人口',fontproperties='simsun')plt.title('人口增长-2',fontproperties='simsun')#设置纵坐标刻度plt.yticks([0, 20, 40, 60, 80])#显示图表plt.show()
2.7 文本和箭头设置 2.7.1 文本设置
Axes.text(x, y, s, fontdict=None, **kwargs)
参数:
【举例】
可以指定以坐标轴坐标表示的文本((0,0)为左下,(1,1)为右上角)。下面的例子将文本放在坐标轴的中心
text(0.5, 0.5, 'matplotlib', horizontalalignment='center',verticalalignment='center', transform=ax.transAxes,color='r')
=ax.可以让文字的位置坐标针对于坐标轴的相对比例进行定位,color可以修改文本颜色
2.7.2 箭头设置
Axes.arrow(x, y, dx, dy, **kwargs)
增加一个箭头,从(x, y) 到(x+dx, y+dy)
参数:
举例:
ax.arrow(0.1,0.7,0,0.15,shape='full',width=0.025,head_width=0.05,fc="#FF2727",alpha=0.5,ec=None,linewidth=0)