一.绘图方式
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)
其中常用的参数包括:
该函数示例代码如下:
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.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()
绘图结果如下:
面向对象的方式
对于面向对象的方式,首先需要新建一个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格式后的正常图片):
结语
以上便是本文的全部内容,如果觉得不错的话可以支持一下,你们的支持是博主码文的不竭动力!!!