本文介绍了我在工程开发过程中使用python的matplotlib.pyplot常用的一些功能。
引用matplotlib.pyplot
import matplotlib.pyplot as plt
一、plt.plot(x0, y0, [fmt],x1, y2, [fmt], ..., **kwargs)
plot可以画多条线,也可以画单条线,每一个[fmt]对应一条线的格式,fmt格式包括的3个属性:标记、线条、颜色。kwargs不能分别定义,包括线段粗细等。建议不同的线分别画,可以避免有些参数不能分别定义的问题。
plot可以用来画线,也可以用来画点(只指定marker不指定line即可画点)。x是x轴所对应的坐标位置,y是y轴所对应的坐标位置,x和y相同位置的数值组合在一起就能表示一个点,所以x和y必须是同样长度的元组、List或者np.array()。
fmt = "[marker][color][linestyle]", 根据fmt中三种参数的不同,会生成不一样效果的图。fmt参数可以三个组合在一起成为一个字符串,也可以分别指代,区别在于:组合形式每个部分只能用单字符,但是分别值代可以用字符串或单字符。以下两段代码的效果是一样的:
x = np.arange(1,10)
y = x
plt.plot(x, y, "o:r")//圆点标记、虚线、红色
x = np.arange(1, 10)
y = x
plt.plot(x, y, linestyle=":", marker="o", color="red")
常用的marker:"o"实心点,"."点,","极小像素点,"^"上三角,">"右三角,"+"十字……等
常见的linestyle:"-" "solid",":" "dotted","--" "dashed"破折线,"-." "dashdot"点划线,"" "None"指定不画线等
常见的color:"r"red,"k"black,"w"white,"g"green,"y"yellow……等
更多color参见color,更多marker参见marker
marker的样式确定后,marker的属性也可以被更改:markersize或ms,可指定marker的大小;markerfacecolor或mfc,可修改marker填充颜色;markeredgecolor或mec,可修改marker边缘颜色。
linestyle被确定后,可以修改线的宽度,linewidth或lw:如linewidth = "10"。
二、标题和轴标签
设置图片标题
plt.title("标题", fontsize=12, loc="center")//loc:left, right, center
设置轴标签
plt.xlabel("x轴标题", fontsize=12, loc="left")//loc: left, right, center
plt.ylabel("y轴标题", fontsize=12, loc="top")//loc: top, bottom, center
三者都有设置字体大小的参数fontsize以及设置标题位置的参数loc,默认为"center"
三、设置轴的取值范围和刻度
设置轴的取值范围。若图像已经画好了,则下述代码不会再设置坐标轴范围,而是输出坐标轴范围
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
设置轴刻度。ticks是一个list,对应的是轴刻度,可以是小数可以是整数,ticks不指定的位置不显示刻度;labels也是一个list,长度和ticks相等,内容是你想要在对应刻度显示的内容;rotation是刻度内容旋转角度;fontsize用来设置刻度值的字体大小。
plt.xticks(ticks, labels, rotation=90, fontsize=12)
plt.yticks(ticks, labels, rotation=90, fontsize=12)
四、添加文本
plt.text(x, y, "内容")
更多参数参照文章:plt.text(),包含字体、对齐方式、大小等属性。
五、plt.figure()
该函数操作对象是整张画布,每调用一次此函数就会生成一张画布,所以需要在一开始就定义,它能够定义整张图像的大小、编号、边框和底色等
fig = plt.figure(num=1, figsize=(10,10), facecolor="blue", dpi=80, edgecolor="yellow", frameon=True)
//返回值fig是一个图像单位,根据需要选择是否需要此参数
六、绘制多图
绘制多图,需要用到plt.subplot或plt.subplots,subplot一次只能画一个子图,同时返回一个axe对象,subplots一次性创建多个子图,返回一个figure和axe,subplot不需要调用返回的axe也能在当前子图上操作,但是subplots必须依赖返回的axe才能在子图上进行操作。
对于subplot,不一定需要拿到axe才能操作当前子图,因为subplot一次只能创建一个子图,所以创建完子图后默认的坐标位置就是当前子图,需要注意的是拿到axe对象进行操作时,需要在成员函数的名字前需要加上set_,如plt.title("")变为axe.set_title(""):
下面两段subplot实现的效果是一样的
################################
x = np.arange(1,10)
y = x
fig = plt.figure(figsize=(10,10))
ax = plt.subplot(1,2,1)
ax.set_title("y=x")
ax.set_xticks([i for i in range(1, 10)])
ax.plot(x,y)
ax = plt.subplot(122)
ax.plot(x, y, ":")
#################################
x = np.arange(1,10)
y = x
fig = plt.figure(figsize=(10,10))
plt.subplot(121)
plt.title("y=x")
plt.xticks([i for i in range(1,10)])
plt.plot(x,y)
plt.subplot(122)
plt.plot(x, y, ":")
对于subplots,因为一次性把所有子图都先布局好,所以索引返回值是必不可少的,同时subplots中融合了plt.figure()的功能
x = np.arange(1,10)
y = x
fig, ax = plt.subplots(1,2,figsize=(12,12). facecolor="w")
ax[0].plot(x,y)
ax[0].set_xticks([i for i in range(1,10)])
ax[0].set_title("y=x")
ax[1].plot(x,y,"o")
############################
需要注意的是,当定义子图分布只有一行或一列时,axe的索引也只有一位,
当子图分布是两行两列及以上时,axe的索引也要变成ax[0,0],ax[0,1]这样的形式
也可以:fig, [[ax0, ax1], [ax2, ax3]] = plt.subplots(2, 2)
############################
subplots()还有更多的参数,如共享坐标轴范围,详见subplot和subplots
七、设置图片尺寸
前边我们知道在plt.figure()中可以通过"figsize"参数设置图片的大小比例,但是这是在画图之前设置的,如果我们已经做了一系列plt画图操作,这个时候发现图片的比例不对,需要调整一下图片的比例,可以使用:
plt.gcf().set_size_inches(x_length, y_length)
八、savefig
需要把图像保存到本地,最简单的是savefig()函数,两种使用方法分别对应两种情况,多fig下要用fig.savefig()的方式
##########################
x = np.arange(1,10)
y = x
plt.plot(x, y)
index = 1
plt.savefig(f"./figure_{index}.png")
##########################
fig1 = plt.figure(1)
plt.plot(x,y)
fig2 = plt.figure(2)
plt.plot(x,y,":")
fig1.savefig("./fig1.png")
fig2.savefig("./fig2.png")
另外,保存的图片若想白边少一点,则使用如下参数:
plt.savefig("./1.png", bbox_inches = 'tight')
# 此时生成的图片将会适应图框大小,减少白边,免去后期裁剪
九、imshow
语法:plt.imshow(x, cmap, alpha......),我一般用它来画混淆矩阵
x = [[1,2],[3,4]]
plt.imshow(x, cmap=plt.cm.gray, alpha=0.5)
plt.text(0, 0, "TP")
plt.text(0, 1, "FP")
plt.text(1, 0, "FN")
plt.text(1, 1, "TN")
plt.xlabel("prediction")
plt.ylabel("label")
plt.xticks([0, 1], ["true", "false"])
plt.yticks([0, 1], ["true", "false"])
//生成与x的形状相同的方块矩阵,与x的内部值没关系,只与其形状有关系
//alpha设置透明度
十、添加图例
只需要在原来plot()中的label参数赋名字,然后使用plt.legend()即可
x1 = [……]
y1 = [……]
x2 = [……]
y2 = [……]
plt.plot(x1, y1, 'r-.', label = 'label')
plt.plot(x2, y2, 'b--.', label = 'predict')
plt.legend()
plt.show()
十一、画箭头
画箭头的指令最常用的是arrow():
plt.arrow(x, y, dx, dy, head_length=0.5, head_width=0.5, color='k')
# (x, y)是起点的坐标,dx dy分别是箭头的终点基于起点坐标(x, y)的偏移量,假如我们需要画从(x, y)到
# (x1, y1)的箭头,那么dx=x1-x, dy=y1-y