不容错过的Matplotlib常见用法小结

一.绘图方式

matplotlib是一个重要的数据可视化的库,它具有三种绘图方式可供选择:

  • pyplot:即直接调用封装好的API函数即可直接进行绘图
  • pylab:这种模拟matlab的操作方式不被官方所推崇
  • 面向对象式绘图:最接近底层的绘图方式,当使用该种方式时需先产生figure对象,在画布上产生坐标轴对象,接着就可以在坐标轴上画图

下面我将介绍利用pyplot绘图及对应的面向对象方式绘图的一些常见用法

二.常见用法

pyplot绘图方式一般简写为plt,导入方式如下:

import matplotlib.pyplot as plt

2.1 简单图形的绘制方法

折线图

通过plot()函数,我们可以进行折线图的绘制,该函数的声明如下:

plot(*args, scalex=True, scaley=True, data=None, **kwargs)

其中常用的参数包括:

  • x,y:分别表示所有点的x坐标和y坐标。y和x可以满足某种函数关系,属于*args中的参数
  • linestyle线型,属于**kwargs中的参数
  • color:线颜色,属于**kwargs中的参数
  • marker点形状,属于**kwargs中的参数

折线图绘制的示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10,10,40)
y1,y2 = x / 2, x**2

#plt直接绘图
plt.plot(x,y1,color='r',marker="o")
plt.plot(x,y2,linestyle="-.",color='b',marker="v")
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.plot(x,y1,color='r',marker="o")  #在坐标轴对象上进行绘图
ax.plot(x,y2,linestyle="-.",color='b',marker="v")
plt.show()
"""

结果展示如下:
折线图

条形图

通过bar()函数可以进行条形图的绘制,该函数的声明如下:

bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

其中常用的参数包括:

  • x:柱形的横坐标
  • y:对应柱形的高度
  • width:柱形的宽度
  • color:柱形的颜色

条形图绘制的示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1,7)
y1,y2 = [20,40,10,50,60,80],[30,20,60,50,80,65]
barwidth = 0.3
#plt直接绘图
plt.bar(x,y1,width=barwidth)
plt.bar(x + barwidth,y2,width=barwidth)
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.bar(x,y1,width=barwidth)  #在坐标轴对象上进行绘图
ax.bar(x + barwidth,y2,width=barwidth)
plt.show()
"""

结果展示如下:
条形图

水平条形图

通过barh()函数可以绘制水平条形图,该函数的声明如下:

barh(y, width, height=0.8, left=None, *, align='center', **kwargs)

其中常用的参数包括:

  • y:每个柱形的y坐标
  • width:每个柱形的水平长度

水平条形图绘制的示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

y = np.arange(1,7)
x1,x2 = [20,40,10,50,60,80],[30,20,60,50,80,65]
barheight = 0.3

#plt直接绘图
plt.barh(y,x1,height=barheight)
plt.barh(y + barheight,x2,height=barheight)
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.barh(y,x1,height=barheight)  #在坐标轴对象上进行绘图
ax.barh(y + barheight,x2,height=barheight)
plt.show()
"""

结果展示如下:
水平直方图

饼状图

通过pie()函数可以进行饼状图的绘制,该函数的声明如下:

pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0,0), frame=False, rotatelabels=False, *, data=None)

其中常用的参数包括:

  • x:每个扇形所占的比重,可以传入原始数据它会自动帮我们计算出各自所占的比重
  • labels:每个扇形的标签,需要按x中的顺序传入标签数组
  • explode:扇形顶点离饼中心的距离(用来进行突出显示用的),同样需要按x中的顺序传入对应的数组
  • shadow:是否在饼图下绘制阴影
  • atuopct:饼图内百分比显示样式控制,例如%1.2f%%表示保留两位小数点且增加百分号

饼状图绘制的示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = [28,16,10,9,37]
labels=["华东地区","华南地区","华北地区","其他","港澳台及海外地区"]
explode = [0,0,0,0,0.05]

plt.rcParams['font.sans-serif']=['SimHei']#正确显示中文

#plt直接绘图
plt.pie(x,labels=labels,explode=explode,autopct=r"%1.0f%%")
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.pie(x,labels=labels,explode=explode,autopct=r"%1.0f%%")  #在坐标轴对象上进行绘图
plt.show()
"""

结果展示如下:
饼图

散点图

通过scatter()函数我们可以进行散点图的绘制,该函数的声明如下:

scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)

其中常用的参数包括:

  • x,y:分别代表点的横纵坐标
  • s:点大小
  • c:点颜色
  • alpha:透明度,值在0~1之间,0代表透明,1代表不透明
  • marker点形状

散点图绘制的示例代码如下:

import matplotlib.pyplot as plt
import pandas as pd

datas = pd.read_csv('基站经纬度数据.csv')
x,y = datas['longitude'],datas['latitude'] #x代表经度,y代表纬度

#plt直接绘图
plt.scatter(x,y,marker="*")
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.scatter(x,y,marker="*")
plt.show()
"""

绘图结果展示如下:
散点图

2.2 图表相关元素设置

标题和x/y轴的标签设置

通过plt.title()或者ax.set_title()函数可以设置相应图标的标题。通过plt.xlabel()/plt.ylabel()或者ax.set_xlabel()/ax.set_ylabel()可以设置对应坐标轴的标签,注意这里ax用来指代axes对象。示例代码如下:

import matplotlib.pyplot as plt
import pandas as pd

datas = pd.read_csv('基站经纬度数据.csv')
x,y = datas['longitude'],datas['latitude']

plt.rcParams['font.sans-serif']=['SimHei']#正确显示中文

#plt直接绘图
plt.scatter(x,y,marker="*")
plt.title("某地区基站经纬度") #设置标题
plt.xlabel('longitude') #设置xlabel
plt.ylabel('latitude') #设置ylabel
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.scatter(x,y,marker="*")
ax.set_title("某地区基站经纬度")
ax.set_xlabel('longitude')
ax.set_ylabel('latitude')
plt.show()
"""

绘图结果展示如下:
标题和标签

网格显示

通过grid()函数可以用来显示网格,该函数的声明如下:

grid(b=None, which='major', axis='both', **kwargs)

其中常用的参数包括:

  • b:设置是否打开网格
  • color:设置网格颜色
  • linestyle:设置网格线型
  • linewidth:设置网格线宽

该函数示例代码如下:

import matplotlib.pyplot as plt
import pandas as pd

datas = pd.read_csv('基站经纬度数据.csv')
x,y = datas['longitude'],datas['latitude']

#plt直接绘图
plt.scatter(x,y,marker="*")
plt.grid(linestyle="--")
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.scatter(x,y,marker="*")
ax.grid(linestyle="--")
plt.show()
"""

绘图结果如下:
网格

图例显示

通过legend()方法可以用来显示图例,该函数的声明如下:

legend(*args, **kwargs)

其中常用的参数包括:

  • handles:添加到图例中的绘图对象(可省略)
  • labels:对应于handles对象顺序的label,可省略(此时需要在画图时通过label参数指定每个图形对象的名称)
  • loc:图例设置的位置
    图例位置
  • ncol:图例的列数,可以通过该参数使得图例分列显示

该函数的示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,10,50)
y1,y2,y3,y4 = x / 2, np.sqrt(x), np.log(x), x**1.5 

#plt直接绘图
plt.plot(x,y1,label='linear')
plt.plot(x,y2,label='sqrt')
plt.plot(x,y3,label='log')
plt.plot(x,y4,label='power')
#若每个绘图对象都未指定label,则需要通过labels参数指定,即添加handles=['linear','sqrt','log','power']
plt.legend(ncol=2)
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.plot(x,y1,label='linear')
ax.plot(x,y2,label='sqrt')
ax.plot(x,y3,label='log')
ax.plot(x,y4,label='power')
ax.legend(ncol=2)
plt.show()
"""

绘图结果如下:
图例

坐标轴范围调整

通过plt.axis([xmin,xmax,ymin,ymax])可以设置坐标轴的范围,其中xmin,xmax,ymin,ymax分别表示x轴左边界,x轴右边界,y轴下边界,y轴上边界。当然,通过plt.xlim(xmin,xmax)plt.ylim(ymin,ymax)方法可以分别调整x轴和y轴的范围,使用该函数时可以传参[minval,maxval]来同时设置某轴的最小值和最大值,也可以分别通过xmin,xmax,ymin,ymax来单独设置某个轴的某个边界值。相应的示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,10,50)
y1,y2,y3,y4 = x / 2, np.sqrt(x), np.log(x), x**1.5 

plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号

#plt直接绘图
#同时修改xy坐标轴范围
plt.subplot(221)
plt.plot(x,y1)
plt.axis([-10,10,0,100])
#只修改x坐标轴范围
plt.subplot(222)
plt.plot(x,y2)
plt.xlim(-10,10)
#只修改y坐标轴范围
plt.subplot(223)
plt.plot(x,y3)
plt.ylim(0,100)
#只修改x坐标轴左边界
plt.subplot(224)
plt.plot(x,y4)
plt.xlim(xmin=-10)

plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax1 = fig.add_subplot(221)
ax1.plot(x,y1)
ax1.axis([-10,10,0,100])

ax2 = fig.add_subplot(222)
ax2.plot(x,y2)
ax2.set_xlim(-10,10)

ax3 = fig.add_subplot(223)
ax3.plot(x,y3)
ax3.set_ylim(0,100)

ax4 = fig.add_subplot(224)
ax4.plot(x,y4)
ax4.set_xlim(xmin=-10)
plt.show()
"""

绘图结果如下:
坐标轴范围修改

坐标轴刻度的调整

通过locator_params()方法来调整坐标轴的刻度间距,该函数的声明为:

locator_params(axis='both', tight=None, **kwargs)

其中常用的参数包括:

  • axis:用来选择要调整的坐标轴,该参数有三个值’both’,‘x’,‘y’
  • nbins:坐标轴划分的等份数

该函数的示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,50,20)
y = 2*x

#plt直接绘图
#只调整x轴刻度
plt.subplot(121)
plt.plot(x,y)
plt.locator_params(axis='x',nbins=20)
#只调整y轴刻度
plt.subplot(122)
plt.plot(x,y)
plt.locator_params(axis='y',nbins=20)
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax1 = fig.add_subplot(121)
ax1.plot(x,y)
ax1.locator_params(axis='x',nbins=20)

ax2 = fig.add_subplot(122)
ax2.plot(x,y)
ax2.locator_params(axis='y',nbins=20)

plt.show()
"""

绘图结果如下:
坐标轴刻度调整

注释的添加

通过使用annotate()方法可以往图形上添加带箭头的注释,该函数的声明为:

annotate(s, xy, *args, **kwargs)

其中常用的参数包括:

  • s:注释字符串

  • xy:要注释的点

  • xytext:放置注释字符串的位置

  • arrowprops:设置在位置xy和xytext之间绘制的箭头的属性,参数类型为字典,其中常用的参数包括

    参数含义
    width箭身的宽度
    headwidth箭头的宽度
    facecolor箭头的颜色

该函数的使用示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,50,20)
y = 2*x

#plt直接绘图
plt.plot(x,y)
plt.annotate("(2,4)",xy=(2,4),xytext=(2,25),arrowprops={"facecolor":'r'})
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.plot(x,y)
ax.annotate("(2,4)",xy=(2,4),xytext=(2,25),arrowprops={"facecolor":'r'})
plt.show()
"""

绘图结果如下:
箭头注释

通过使用text()方法可以往图形上只添加文字注释,该函数的声明为:

text(x, y, s, fontdict=None, withdash=False, **kwargs)

其中常用的参数包括:

  • x,y:文字注释内容的x坐标和y坐标
  • s:文字注释的内容
  • fontfamily:文字字体类型,常用的包括’serif’,‘sans-serif’,‘cursive’,‘fantasy’,‘monospace’
  • fontstyle:字体样式,常用的包括’normal’,‘italic’,‘oblique’
  • fontsize/size:字体大小,可以采用数字
  • fontweight/weight:设置字体的粗细,可以使用0~1000范围内的数字来设置,数字越大字体越粗

注意:上述函数可以输出数学公式,使用方式和输出文本的用法一致,只需要设置s = r"mathexperssion"即可,其中mathexpression是包含在$$之间的字符串(常用的数学符号编写)。该函数的示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,50,20)
y = np.sqrt(x)

#plt直接绘图
plt.plot(x,y)
plt.text(15,5,r"$y=\sqrt{x}$",size=20,fontstyle="italic")
plt.show()

"""
#面向对象方式绘图
fig = plt.figure() #创建figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) #添加坐标轴对象
ax.plot(x,y)
ax.text(15,5,r"$y=\sqrt{x}$",size=20,fontstyle="italic")
plt.show()
"""

绘图结果如下:
文字注释

2.3 多图显示

直接通过pyplot

通过plt.subplot()方法可以将figure划分为多个子图,但每条subplot命令只会创建一个子图,该函数的常用使用形式为:

subplot(nrows, ncols, index, **kwargs)

其中常用的参数包括:

  • nrows:figure划分的行数
  • ncols:figure划分的列数
  • index:图案nrows行ncols列划分的块再按从左往右,从上往下的顺序排列的当前图的索引

需要注意的是上面三个参数可以合在一起写,该函数的示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,20,20)
y1,y2,y3 = np.sqrt(x),np.log(x),x**1.5

plt.subplot(131)
plt.plot(x,y1)
plt.subplot(132)
plt.plot(x,y2)
plt.subplot(133)
plt.plot(x,y3)

plt.show()

绘图结果如下:
plt.subplt方式

通过plt.subplots()方法可以创建一个figure和一批子图,返回的形式为(figure, subplots),该方法的常用形式为:

subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw) -> tuple

其中常用的参数包括:

  • nrows:figure划分的行数
  • ncols:figure划分的列数

在使用该方式时,我们可以通过二维索引来获取子图,例如axes[1,1]表示获取到的是第2行第2列的子图对象,然后利用该子图对象我们可以调用画图函数来进行图形绘制,当然也可以通过for循环来获取子图对象。示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,20,20)
y1,y2,y3,y4 = np.sqrt(x),np.log(x),x**1.5,2*x + 2

ys = [y1,y2,y3,y4]
fig,axs = plt.subplots(2,2)
for y,ax in zip(ys,axs.flatten()):#使用for循环时需要展平返回的多维数组
    ax.plot(x,y)

plt.show()

绘图结果如下:
plt方式2

面向对象的方式

对于面向对象的方式,首先需要新建一个figure对象,然后可以利用add_subplot()函数新建坐标轴对象(该函数的参数和plt.subplot()类似),再调用该函数即可进行绘图,示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,20,20)
y1,y2 = np.sqrt(x),np.log(x)

fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax1.plot(x,y1)
ax2= fig.add_subplot(1,2,2)
ax2.plot(x,y2)
plt.show()

绘图结果如下:
面向对象方式

2.4 图片(Image)显示

matplotlib也可以用来展示图片,而且它可以向展示上述的绘制图形一样同时展示多张图片,通过plt.imshow(X)可以用来显示图片,其中X可以是通过PLI.Image.open()cv2.imread()matplotlib.image.imread()打开的图形数据,示例代码如下:

import matplotlib.pyplot as plt
import cv2

imgs = []
for i in range(1,5):
    imgs.append(cv2.imread(str(i) + ".jpg"))
plt.figure(figsize=[4,6])
i = 1
for img in imgs:
    plt.subplot(4,2,i)
    plt.imshow(img)
    i += 1
    #cv2打开图片是按BGR,而matplotlib是按RGB显示因此当使用cv2打开图片是需要先将图片转换为RGB
    img_c = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    plt.subplot(4,2,i)
    plt.imshow(img_c)
    i += 1
plt.show()

结果展示如下(左侧直接展示用cv2打开的,右侧展示通过cv2打开再转化为RGB格式后的正常图片):
多图显示

结语

以上便是本文的全部内容,如果觉得不错的话可以支持一下,你们的支持是博主码文的不竭动力!!!

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯曦巍峨

码文不易,有条件的可以支持一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值