【转载】matplotlib.pyplot 的使⽤总结⼤全(⼊门加进阶)
前⾔
其实⼀年前就有想法好好学学python ⾥的画图库matplotlib 库,主要是因为每次可视化⼀些结果的时候,都是搜⼀些别⼈写好的代码,看的时候感觉乱乱的,不是说别⼈写的乱,⽽是每个⼈在某些点上实现的⽅式不太⼀样,还有就是觉得,总⽤别⼈的,就觉得不是⾃⼰创造的,没有成就感。这段时间做了个⽐赛,可视化分析的时候,⼜在搜代码,想⾃⼰加点东西,感觉很费劲,⼜不知道该怎么加,所以决定好好学⼀下,并做好总结。
借⽤⼀张图,说明画图流程
准备⼯作
我们需要先安装matplotlib 库,然后导⼊库,这些很简单,我就不讲了,哦,把numpy 也导⼊进来。
1. 正式开始
1.1 和 我们经常会在画图的代码⾥看到,有⽤plt.的,有⽤ax.的,两者到底有什么区别呢,画的图有什么不⼀样吗,我们先来⽤两种经常看到的⽅式实现⼀下。
plt.
ax.
上⾯两种代码⽅式最终的结果都如上图所⽰,画图⽅式可视化结果并⽆不同,那区别在哪呢?
其实呢,第⼀种⽅式呢,是先⽣成了⼀个画布,然后在这个画布上隐式的⽣成⼀个画图区域来进⾏画图,第⼆种⽅式,先⽣成⼀个画布,然后,我们在此画布上,选定⼀个⼦区域画了⼀个⼦图,上⼀张官⽅的图,看看你能不能更好的理解。
官⽅图
除了ax 之外,我们也可以直接⽤plt 添加⼦图,⽅式如下
你看,这样添加⼦图,也是⼀样的,fig ,⽣成⼀个画布,plt.subplot(111),将画布分为1x1的分布,并选中第⼀个⼦图进⾏操作。虽然这样看着⼀样呢,但是后⾯修饰图⽚的时候,ax 这个⽅式⽐plt 的⽅式更加⽅便。因此,本⽂我们⽤ax ⽅式来学习画图,也希望⼤家都提前选定⼀种⾃⼰喜欢的⽅式来画图,添加⼦图,等⼀些列操作。
1.2 ⼦图的创建
在上⼀节的介绍中,讲到了⼦图,可能刚接触画图的同学,会有点疑惑,这节,我们来详细讲讲⼦图。我们可以这样来考虑问题,我们画图的时候,到⼀张纸(画布),然后打算把这张纸分成⼏个区域(⼦图)来画⼏幅不同的画。⼦图的创建可以是⼀些简单创建,⽐如这样的,221⾥⾯前两个代表的是画布划分的⾏数和列数,公共分为4个⼦图,最后⼀个1是代表,现在选中第⼀个⼦图。
import matplotlib.pyplot as plt
import numpy as np
plt ax
fig=plt.figure(num=1,figsize=(4,4))
plt.plot([1,2,3,4],[1,2,3,4])
plt.show()
fig=plt.figure(num=1,figsize=(4,4))
ax=fig.add_subplot(111)
ax.plot([1,2,3,4],[1,2,3,4])
plt.show()linspace函数调用的格式为
fig=plt.figure(num=1,figsize=(4,4))
plt.subplot(111)
plt.plot([1,2,3,4],[1,2,3,4])
plt.show()
fig=plt.figure(num=1,figsize=(4,4))
ax1=fig.add_subplot(221)###可从图中看到,我们的画布是分为2x2的区域
ax1.plot([1,2,3,4],[1,2,3,4])
ax2=fig.add_subplot(222)
ax2.plot([1,2,3,4],[2,2,3,4])
ax3=fig.add_subplot(223)
ax3.plot([1,2,3,4],[1,2,2,4])
ax4=fig.add_subplot(224)
ax4.plot([1,2,3,4],[1,2,3,3])
plt.show()
ax1=fig.add_subplot(221)idspec as gridspec#调⽤⽹格
fig=plt.figure(num=1,figsize=(4,6))#创建画布
gs=gridspec.GridSpec(3,3)#设定⽹格
ax1=fig.add_subplot(gs[0,:])#选定⽹格
ax1.plot([1,2,3,4],[1,2,3,4])
ax2=fig.add_subplot(gs[1,:-1])
ax2.plot([1,2,3,4],[1,2,3,4])
ax3=fig.add_subplot(gs[1:,-1])
ax3.plot([1,2,3,4],[1,2,3,4])
ax4=fig.add_subplot(gs[2,0])
ax4.plot([1,2,3,4],[1,2,3,4])
ax5=fig.add_subplot(gs[2,1])
ax5.plot([1,2,3,4],[1,2,3,4])
plt.show()
2. 常⽤通⽤函数讲解
现在跳过刚刚哪些⽐较⼤的⽅向,讲解⼀些⽐较细碎且通⽤⼜常⽤的画图函数,这些函数可以说是装饰我们的图,使得我们的图更加美观且直观的装饰品。
我们举个例⼦来讲解,使⼤家更直观地看到我们讲解的函数在图的绘制中的作⽤。
例1:现有某某⽔果店⼀周的苹果的销售记录数,店长想更加直观的观察⽐较这⼀周的销售情况。销售情况:apple=78kg,80kg,79kg,81kg,91kg,95kg,96kg
app=[78,80,79,81,91,95,96]
x=np.arange(1,8)
fig=plt.figure(num=1,figsize=(6,4))
ax=fig.add_subplot(111)
ax.plot(x,app)
plt.show()
看着这个图,什么感受,我是觉得难看!
注:这⾥我们直接⽤了plot()函数画了⼀个坐标图,这是⼀个封装好的函数,我们输⼊参数,就可直接⽣成此样式的图,除此之外还有饼图,散点图,直⽅图,我们下⼀篇讲这些已经封装好的图。
现在我想给它装修⼀下,⽐如在x轴上加⼊星期类标,还想这个图⾥的折线能不能悬浮在上空,给图加个标题等等。在开始装修之前,我们先来个⼩插曲,就是在图中显⽰中⽂的问题,如果我们不搞点操作,你会发现,你的中⽂在图中会以⼀个个正⽅形框框显⽰。
2.1 插曲:中⽂显⽰问题
加⼊⼀⾏这个代码,我们的中⽂就能正确显⽰了,这⾏代码就是把我们的字体设置为“SimHei”中⽂⿊体。除了字体设置还有以下属性
字体的样式有以下选择
除了在全局设置字体外,我们也可以在特征显⽰中⽂的位置设置⼀个属性fontproperties,这个,我们讲到再给⼤家演⽰。
现在回来,我们继续讲装修图的问题,介绍⼏个函数
#函数⾥的参数,是根据我们的例⼦特定设置的,不同问题,不同的设置,
需要看图⽚效果,参数
#设置刻度范围
ax.set_xlim(1,7.1)#x轴从1到7.1
ax.set_ylim(40,100)#y轴从40到100
#设置显⽰的刻度
ax.set_xticks(np.linspace(1,7,7))#np.linspace()函数为等差数列,1⾄7的7个数组成的等差数列1,2,3,4,5,6,7,
ax.set_yticks(np.linspace(50,100,6))#关于等差数列,想了解的可以参看numpy的⽤法
#设置刻度标签
ax.set_xticklabels(["星期⼀","星期⼆","星期三","星期四","星期五","星期六","星期⽇"],fontproperties="SimHei"\
,fontsize=12)
#这⾥⽤到了属性fontproperties可以单独设置x轴标签的字体,也可以⽤fontsize设置字体⼤⼩,还可以⽤color
设置字的颜⾊
ax.set_yticklebels(["50kg","60kg","70kg","80kg","90kg","100kg"],fontsize=12)
现在我们来加进我们之前画图的代码中,看看效果
app=[78,80,79,81,91,95,96]
x=np.arange(1,8)
fig=plt.figure(num=1,figsize=(6,4))
ax=fig.add_subplot(111)
ax.plot(x,app)
ax.set_xlim([1,7.1])
ax.set_ylim([40,100])
ax.set_xticks(np.linspace(1,7,7))
ax.set_yticks(np.linspace(50,100,6))#可调控字体⼤⼩,样式,
ax.set_xticklabels(["星期⼀","星期⼆","星期三","星期四","星期五","星期六","星期⽇"],fontproperties="SimHei",\
fontsize=12,rotation=10)
#参数rotation=10,可以使得类标旋转值为10的⾓度
ax.set_yticklabels(["50kg","60kg","70kg","80kg","90kg","100kg"])
plt.show()
这是初步修改过的图,我们现在装饰⼀下轴上的刻度线,使得y轴中不显⽰刻度线和其他的⼀些⼩细节修改。
2.2 tick_params()函数
##借⽤函数tick_params()可以装修轴上的刻度线和轴标签
ax.tick_params()
###看⼀下此函数的⼀些重要参数
axis: 可选"x","y","both",默认"both",分别代表,对x轴操作,对y轴操作,对两个轴都操作。
direction: 可选 "in","out","inout"代表,刻度线显⽰在坐标轴⾥⾯,坐标轴外边,双边
为了更加显眼,让⼤家看出不同,我超纲操作了⼀下,给刻度线设置⼀下颜⾊,和长度,可以看出区别了吧,现在我们就把超纲的地⽅补上。
length: 刻度线长度,上⾯图⾥的刻度线长度,我设置的为6
color: 刻度线颜⾊,上⾯图⾥的刻度线颜⾊,我设置的为“r”
width:刻度线宽度
pad:刻度线与刻度标签之间的间隔
bottom, top, left, right四个参数对应四个边框,它们的取值为布尔类型,True 表⽰显⽰对应边框上的刻度线,False,代表不显⽰,默认True
labelbottom, labeltop, labelleft, labelright,与上⾯四个对应,代表的是四个边框上的类标的设置,取值为布尔类型,True代表显⽰对应边框上的类标,False代表不显⽰。
labelsize:类标⼤⼩的设置参数,可取浮点型数值,也可去"medium","large","small"
labelrotation:旋转类标⼀定的⾓度,与在set_xticklabels()中的参数rotation作⽤相同。
我们来实际操作⼀下
#将此代码插⼊到之前的代码中即可
ax.tick_params(left=False,pad=8,direction="in",length=2,width=3,color="b",labelsize=12)
ax.tick_params("x",labelrotation=10)#类标旋转
y轴上的刻度线没有了。
添加轴坐标标签,表头,图例
ax.set_xlabel("星期")#添加x轴坐标标签,后⾯看来没必要会删除它,这⾥只是为了演⽰⼀下。
ax.set_ylabel("销售量",fontsize=16)#添加y轴标签,设置字体⼤⼩为16,这⾥也可以设字体样式与颜⾊
ax.set_title("某某⽔果店⼀周⽔果销售量统计图",fontsize=18,backgroundcolor='#3c7f99'\
fontweight='bold',color='white',verticalalignment="baseline")#标题(表头)
使⽤到的set_title()参数有很多,介绍⼏个常⽤的
fontsize:默认12,可选参数还有'xx-small', 'x-small', 'small', 'medium', 'large','x-large', 'xx-large'
backgroundcolor:背景颜⾊
fontweight:字体粗细,可选参数为'light', 'normal', 'medium', 'semibold', 'bold', 'heavy', 'black'
color:字体颜⾊
fontstyle:设置字体类型,可选参数 'normal' | 'italic' | 'oblique' ,italic斜体,oblique倾斜
verticalalignment:设置⽔平对齐⽅式,可选参数: 'center' , 'top' , 'bottom' ,'baseline'
此参数可设置title与正图的位置。
⽬前得到的图中,我想把上,右轴的线给去掉,给其他两个轴线换⼀下粗细合颜⾊,怎么做?
2.3 splines
#ax.spines["left"].set_color("darkblue")#设置左轴的颜⾊,我们图中未⽤
#ax.spines["bottom"].set_linewidth(3)#底轴线条宽度设置
添加到之前的代码中2.4 图例添加 loc:可取"best",1或者"upper right",2或"upper left",3或"lower left",4或"lower right",代表放不同位置
fontsize : int 或float 或{‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’},字体⼤⼩shadow: 是否为图例边框添加阴影
labelspacing: 图例中条⽬之间的距离
handlelength: 图例句柄的长度
有没有觉得我们的图像点样⼦了,哈哈,还是有点不好看,觉得图中的折线不好看,怎么调呢,为了
造好看的图,我们先来学习ax.plot ()函数
2.5 ax.plot(x,y,format_string) 坐标图x: x 轴数据,列表或数组,可选参数,当我们在这个函数⾥,只展⽰⼀组数据时,x 可省略。
y : y 轴数据,必须有。
format_string :主要来控制我们画的曲线的格式:颜⾊,风格,标记,可取三者的组合如:“g-o”,"r-.D",如果不⽤组合,则⽤color,marker,linestyle,三个参数分别指定。label : 添加图例的类标。
颜⾊
风格
标记
如果店长有搞了这周⾹蕉的销售量,想与苹果的销售量做⼀下对⽐
这样看着还挺不错,不知道我审美有没有问题,嘻嘻!
2. 在指定位置添加标签
还有⼀个⽐较常⽤的函数,ax.text(),可以在图中指定位置添加标签
<(),参数讲解
x,y : 放置text 的位置,横纵坐标。
s : str ,text 内容。
fontsize : 设置字体⼤⼩,默认12,可选参数 ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’,‘x-large’, ‘xx-large’
fontweight :设置字体粗细,可选参数 ‘light’, ‘normal’, ‘medium’, ‘semibold’, ‘bold’, ‘heavy’, ‘black’
alpha : 透明度,参数值0⾄1之间。
rotation : (旋转⾓度)可选参数为:vertical,horizontal 也可以为数字。
backgroundcolor :背景颜⾊。
color : 字体颜⾊。
#ax.spines["bottom"].set_linewidth(3)#底轴线条宽度设置
ax.spines["top"].set_visible(False)#上轴不显⽰
ax.spines["right"].set_visible(False)#右
ax.spines["left"].set_visible(False)#左
legend()
ax.legend(("苹果"),loc=3,labelspacing=2,handlelength=4,fontsize=14,shadow=True)
##⼀般添加图例时,会在画图的函数⾥,⽐如ax.plot()函数中添加⼀个label 参数,则后⾯直接ax.legend(loc="")
##不需要第⼀个参数了。
###loc 的可取"best",1或者"upper right",2或"upper left",3或"lower left",4或"lower right",代表放不同位置
ax.plot(x,app,label="苹果")
ax.legend(loc=3,labelspacing=2,handlelength=3,fontsize=14,shadow=True)
#ax.plot(x,app,label="苹果")
ax.plot(x,app,"r-.d",label="苹果")#在原来的基础上添加“r-.d”
##添加此⾏代码
ban=[70,80,81,82,75,90,89]
ax.plot(x,ban,"c-d",label="⾹蕉")
##最后添加此操作,得到的图
<(7,97,"max:96",fontsize=14,color="g",alpha=1)
<(6,86,"max:90",fontsize=12,alpha=1)
除了text()函数可以添加标注之外,还有⼀个可以添加箭头的标注函数annotate()
2.7 annotate():参数讲解
s: 添加标注的内容,字符串形式。
xy: 箭头指向的位置,就是我们想添加标注的对象,元组类型输⼊⽅式。
xytext:添加标注的实际位置,标注实际所在位置,可看做箭头输出端。
arrowprops: 此参数中提供箭头属性字典来绘制从⽂本到注释点的箭头。
width : 箭把宽度,整数或浮点数。
frac:箭头头部所占的⽐例,⼩于1。
headwidth:箭头头部宽度,整数或浮点数。
headlength: 箭头长度,整数或浮点数。
facecolor: 填充⾊。
shrink:移动提⽰,并使其离注释点和⽂本⼀些距离,<1,⼤⽩话说就是,别让箭头两端
⾥标注点和⽂本太近。
frontsize:可以设置字⼤⼩,这个参数遇到很多次了。
我们来设置⼀下
ax.annotate(s="min:70",xy=(1,70),xytext=(1.3,66),arrowprops=dict(facecolor="y",shrink=0.05, headwidth=12,headlength=6,width=4),fontsize=12)
最后把最全代码放⼀下
import matplotlib.pyplot as plt
import numpy as np
app=[78,80,79,81,91,95,96]
ban=[70,80,81,82,75,90,89]
x=np.arange(1,8)
fig=plt.figure(num=1,figsize=(6,4))
ax=fig.add_subplot(111)
ax.plot(x,app,"r-.d",label="苹果")
ax.plot(x,ban,"c-d",label="⾹蕉")
ax.set_xlim([1,7.1])
ax.set_ylim([40,100])
ax.set_xticks(np.linspace(1,7,7))
ax.set_yticks(np.linspace(50,100,6))#可调控字体⼤⼩,样式,
ax.set_xticklabels(["星期⼀","星期⼆","星期三","星期四","星期五","星期六","星期⽇"],fontproperties="SimHei",fontsize=12)
ax.set_yticklabels(["50kg","60kg","70kg","80kg","90kg","100kg"])
ax.tick_params(left=False,pad=8,direction="in",length=2,width=3,color="b",labelsize=12)
ax.tick_params("x",labelrotation=10)#类标旋转
#ax.set_xlabel("星期")#添加x轴坐标标签,后⾯看来没必要会删除它,这⾥只是为了演⽰⼀下。
ax.set_ylabel("销售量",fontsize=16)#添加y轴标签,设置字体⼤⼩为16,这⾥也可以设字体样式与颜⾊
ax.set_title("某某⽔果店⼀周⽔果销售量统计图",fontsize=18,backgroundcolor='#3c7f90',\
fontweight='bold',color='white',verticalalignment="baseline")
#ax.spines["left"].set_color("darkblue")#设置左轴的颜⾊
#ax.spines["bottom"].set_linewidth(2)#底轴线条宽度设置
ax.spines["top"].set_visible(False)#上轴不显⽰
ax.spines["right"].set_visible(False)
ax.spines["left"].set_visible(False)
<(7,97,"max:96",fontsize=14,color="g",alpha=1)
<(6,86,"max:90",fontsize=12,alpha=1)
ax.annotate(s="min:70",xy=(1,70),xytext=(1.3,66),arrowprops=dict(facecolor="y",shrink=0.05,\
headwidth=12,headlength=6,width=4\
),fontsize=12)
ax.legend(loc=3,labelspacing=1,handlelength=3,fontsize=14,shadow=True)
plt.show()
还有⼀个关于,图中颜⾊的问题,颜⾊的种类选择,⼤家⽹上⼀搜都有,这⾥只要带颜⾊的参数,都可⽤。
2.8 plt.savefig 保存图⽚
最后讲解⼀个图⽚保存成.jpg和.png⽂件的函数:plt.savefig("保存的⽂件路径")
注:此函数需放置在show()函数之前。
#保存为jpg⽂件
plt.savefig("figure.jpg")#我这⾥填的是相对路径,如果想保存在指定⽂件夹下,填写绝对路径。
#保存为png⽂件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论