深入详解matplotlib画图进阶

640?wx_fmt=jpeg

640?wx_fmt=gif

学AI不用报班,进入公众号获取

免费资源,更有超多电子书面试真题


进入正文


一、 matplotlib的图形结构

640?wx_fmt=other  

前面我已经写过关于matplotlib的画图架构方面的问题,我们一般有两种画图的方式,第一是通过“面向对象”的思想,逐层画图,像“艺术家一样,第二是脚本画图,这样画图的思路简单,但代码的严谨性不强,因为这是高度封装的,我们也可以两者结合起来画图,平时看见很多的文章,讲解matplotlib画图方法,感觉解释的不清不楚,虽然知道干了什么,但是不清楚为什么这么做,所以花了点时间,自己写一篇。(可以参见我的另一片博文:matplotlib教程——matplotlib的软件架构

     不管采用什么样的画图,我们按照一定的画图步骤,先干什么,在干什么,就会有条理,很浅显易懂。

matplotlib的图形结构
matplotlib的图形组成

1.1

640?wx_fmt=other

如果熟悉C#的chart画图控件的使用,那么对此处一定不陌生,matplotlib的图形具有和chart相似的组成结构,如下图所示:

640?wx_fmt=png

640?wx_fmt=other

从上面的结构组成图可以看出,一幅图像是具有层层嵌套的组成结构的,先轮廓,再具体设置,根据这个思路,画出来的图就比较好看了,而不是随意的杂乱的设置。

matplotlib的图形结构
matplotlib的画图流程

1.2

640?wx_fmt=png

640?wx_fmt=other

按照上面的画图流程,我们平时所见的一些主要设置基本上都会涉及到,不会遗漏,也不会杂乱无章。

Next

二、 matplotlib的画图步骤

matplotlib的画图步骤
matplotlib创建图形及子图

2.1


2.1.1 图形的创建

f=plt.figure(num=2,figsize=(16,12),dpi=80,facecolor="pink",edgecolor='green',frameon=True)

#print(plt.setp(f))   #使用该方法可以查看到底有多少参数可以设置,分别是哪一些

640?wx_fmt=other

注意:

(1)返回的 f 指总得图像,对应那幅图中的第一层对象。 

(2)Num的默认值为1,就是弹开的那个图形窗口左上角的Figure 2

(3)设置所有图形总标题:f.suptitle('总标题')   此为所有的子图设置的总标题,显示在最上面。

(4)第二句话可以查看到底有哪些参数可以设置。



2.1.2 子图创建的几种方式

fig1=plt.subplot(1,2,1)     #借助plt创建

fig2=f.add_subplot(1,2,2)   #借助总图所返回的f对象

#还可以借助gridspec()      #先不做讨论

640?wx_fmt=other

注意:

(1)这里返回的fig实际上是一个Asex对象,它是上面结构组成那幅图中的第二层对象

(2)上面返回的实际上都是Asex对象,但是上面所创建Axes一般都是规律性排列的,通过三个参数指定具体的排列,即在哪一行,哪一列,使用gridspec则可以实现按照表格的相关格局进行排列,那如果要将一个新的Axes排在任意位置,则还可以使用以下两种方法创建一个新的fig,如下所示:

fig3=f.add_axes([0.1,0.1,0.5,0.5],facecolor='grey')

fig4=plt.axes([0.2,0.2,0.4,0.4],facecolor='green')

640?wx_fmt=other

注意:

   上面两种方法所返回的依然是Axes对象,只不过相比于前面的几种方法而言,Axes所放置的位置更加随意的,是任意放置的,通过[x,y,width,height],上面的四个值都是“相对取值”,故而在0~1之间,前面两个是以左下角作为基准的,后面两个数字指的是相对于整个figure对象的宽度和高度。

     其实我们对图像的自定义,主要就是对第二层对象Axes及其子对象的设置,第二层对象里面所包含的对象有一下一些常见的对象:

a、两条坐标轴xaxis  yaxis及坐标轴标题

b、Title

c、图像(比如line曲线等)

d、Legend

e、Grid

f、Text

g、Annotation

等,下面会按照这个顺序进行讲解。

640?wx_fmt=other

补充: gridspec布局子图位置,如下代码:

G=matplotlib.gridspec.GridSpec(3,3)
fig1=f.add_subplot(G[0,:],facecolor='red')
fig2=f.add_subplot(G[1,0:2],facecolor='pink')
fig2=f.add_subplot(G[1,2],facecolor='blue')
fig2=f.add_subplot(G[2,0],facecolor='grey')
fig2=f.add_subplot(G[2,1:3],facecolor='green')

运行结果如下:

640?wx_fmt=png

matplotlib的画图步骤
matplotlib画图的五大核心模块

2.2

640?wx_fmt=other

图例、标题、坐标标题、网格、图像的确定——五大核心模块

本节讲画图过程中五大核心模块的实现以及设计,对应于上面的流程图,我们在画图的时候,既可以通过“面向对象”的思想去确定,也可以使用脚本的方式去确定相关的参数。


2.2.1 与坐标轴相关的设置

#(1)显示范围:
fig1.axis([xmin,xmax,ymin,ymax])
plt.axis([xmin,xmax,ymin,ymax])

#(2)分别设置x,y轴的显示范围:
fig1.set_xlim(2,4) 
fig1.set_ylim(2,4)
plt.xlim(2,4)   
Plt.ylim(2,4)

#(3)设置刻度:
fig1.set_yticks([-1,-1/2,0,1/2,1])  
fig1.xaxis.set_ticks([1,2,3,4,5,6,7,8])   #先获取x轴
#  这两种方法只能设置数字刻度

plt.xticks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi],['aaa','bbb','ccc','ddd','eee'],fontsize=‘xx-large’)
#这种方法可以将对应的数字用字符串替代出来

#若要显示π、α等一些特殊的数学符号,则可以通过以下来完成
plt.xticks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi],['$0$','$\pi/2$','$\pi$','$3\pi/2$','$2\pi$'],fontsize=‘xx-large’)
# ——该方法称之为LaTeX语法

#(4)坐标轴的显示和移动
# 默认坐标轴有四条,上下左右。
#(a)坐标轴不显示
zuobiao_zhou=plt.gca()  #获得坐标轴句柄,这是一种方式
zuobiao_zhou.spines['top'].set_color('none')
zuobiao_zhou_01=fig1.axes   #获得坐标轴对象,这是另一种方式
zuobiao_zhou_01.spines['right'].set_color('none')

#(b)设置刻度是显示在哪一条坐标轴旁边
zuobiao_zhou_01.yaxis.set_ticks_position('right')
zuobiao_zhou.xaxis.set_ticks_position('top')

#(5)设置主要-次要坐标轴
fig2=f.add_subplot(1,2,2)
line2,=plt.plot([1,2,3,4,5],[2,4,6,8,10],marker='>',label='第一条直线') 

#画图
plt.title('两条直线综合')                              #标题
fig2.legend(loc=2)                                   #图例
fig2.set_xlabel('横坐标')                             #设置坐标
fig2.set_ylabel('纵坐标一')
#-----------------------------------------------------------上面是主坐标系
fig3=fig2.twinx()             # 双胞胎,就是设置次坐标轴
line3=plt.plot([6,7,8,9,10],label='第二条直线')
fig3.legend(loc=1)
fig3.set_ylabel('纵坐标二')
#------------------------------------------------------------次要坐标系
plt.grid()                                 #网格
plt.show()

640?wx_fmt=other

在使用主从坐标系的时候,最好是使用“面向对象”的思想,而不要全部使用plt,这样容易混淆不知道到底是给哪一个Axes设置相关的东西。





2.2.2 与图像线条相关的设置

#(1)关闭抗锯齿  
line1.set_antialiased(False)

#(2)线条样式的各种设置——四种设置方法
#方法一:直接在画线的时候通过“字符串参数”加以指定
line1,=fig1.plot(x,y,'r-')  #简单设置可以这样使用

#方法二:直接在划线的时候通过参数指定,如下:
line1,=fig1.plot(x,y,color='red',linewidth=3,linestyle='--')

#方法三:通过line.set_xxxx()的方式加以设置,如下:
line1,=fig1.plot(x,y1)
line1.set_color('black')
line1.set_linestyle('-')
line1.set_alpha(0.3)
line1.set_linewidth(8)

#方法四:通过plt.setp(line,xxxxxxxxx)方法去设置
plt.setp(line1,color='black',linewidth=8,linestyle='-',alpha=0.3)

'''推荐使用二三四种方法。
注意,设置线条样式的属性非常的多,我们可以通过以下方式加以查看'''
Print(plt.setp(line))   #会显示到底有哪些属性可以设置

#(3)下面是常见的属性设置:
'''常见的颜色:——除了使用字母,还可以使用十六进制的字符串表示,比如“#008000”,这样任意一种颜色均可以使用了。
        ``'b'``          blue
        ``'g'``          green
        ``'r'``          red
        ``'c'``          cyan(青色)
        ``'m'``          magenta(品红)
        ``'y'``          yellow
        ``'k'``          black
        ``'w'``          white
常见的线型:
        ``'-'``          solid line style
        ``'--'``         dashed line style
        ``'-.'``         dash-dot line style
        ``':'``          dotted line style
常见的点标记marker:
 '.'       point marker
','       pixel marker
'o'       circle marker
'v'       triangle_down marker
'^'       triangle_up marker
'<'       triangle_leftmarker
'>'       triangle_rightmarker
'1'       tri_down marker
'2'       tri_up marker
'3'       tri_left marker
'4'       tri_right marker
's'       square marker
'p'       pentagon marker
'*'       star marker
'h'       hexagon1 marker
'H'       hexagon2 marker
'+'       plus marker
'x'       x marker
'D'       diamond marker
'd'       thin_diamond marker
'|'       vline marker
'_'      hline
'''





2.2.3 与图例相关的设置

#(1)设置图例的几种方式
    #方式一:在画线的时候设置label,调用legend函数即可。
    #方式二: 
line1.set_label("正弦曲线")         #确定图例
fig1.legend(['正弦','余弦'],loc='upper left')
    #方式三:
legend((line1,line2, line3), ('label1', 'label2', 'label3'))

#(2)legend()图例显示的位置
#(3)loc :表示图例显示的位置
   '''===============   =============
        Location String   Location Code
      ===============   =============
        'best'            0
        'upper right'     1
       'upper left'      2
         'lower left'      3
        'lower right'     4
          'right'           5
         'center left'     6
          'center right'    7
         'lower center'    8
           'upper center'    9
            'center'          10

 (4)其他参数设置
        facecolor='green',
        edgecolor=‘black’
        frameon=True,
        shadow=True,
        framealpha=0.5,
        fontsize='xx-large'
等等
'''





2.2.4 与标题title相关的设置

'''
(1)  两种设置的方式
    方式一: fig1.set_title("这是第一幅图")      #设置标题
    方式二: plt.title('这是第二幅图') 
(2)其他参数的设置
        loc : {'center', 'left', 'right'},设置标题显示的位置
        pad :float  设置标题距离图像上边缘有多远
        fontsize:设置字体大小,如‘xx-large’
        color='red'设置字体颜色
'''





2.2.5 与网格grid相关的设置

'''
which='major',给主坐标还是次坐标
axis='x',       只显示哪一个轴或者是两者
color='r',     颜色
linestyle='-',   线型
linewidth=2   线粗
'''

本节总结

本节主要介绍了使用matplotlib绘制图形的时候,五大必不可少的模块,一般,我们画图的时候就按照这样的模块进行画图,就不会遗漏,而且条理清晰,可以画出较为优美的图形。

Next


三 、 matplotlib的文本及注释

640?wx_fmt=other

虽然有了上面的五大基本模块,但是有时候在画图的时候需要针对图形做出一些基本的注释和标记,这就需要用到文本text和注释annotation。

matplotlib的文本及注释
matplotlib的文本Text

3.1

#两种设置方式均可,即
    #方式一:
fig.text(x,y,s)
    #方式二:
plt.text(x,y,s).

'''其中,x,y表示的是文本插入的位置,s表示的是文本的内容,还有一些常见的可选参数如下:
    Alpha=0.5
    color='green',
    backgroundcolor=‘yellow’
    fontsize=15,(可以简写为size)
    fontstyle=20(可以简写为style)
    rotation='60',表示文本旋转多少度
    fontweight='bold',(可以简写为weight)取值可以是(normal bold heavy light ultrabold ultralight)
    family=‘serif’ 字体
    linespace=1.5  字体行距
    horizontalalignment=‘center’ x参数表示的位置(也可以简写为ha)取值可以是(center right left)
    verticalalignment=‘center’  y参数表示的位置(简写为va)取值可以是(center top bottom baseline)
    multialignment=‘center’ 多行位置控制 取值可以是(center right left)
注意:最后三个参数负责布局的控制'''

#(1) 设置文本的边框——通过设定bbox来完成
    #方式一:
bbox_props =dict(box, fc="red", ec="0.5",alpha=0.9,pad=0.6)
plt.text(参数列表,bbox=bbox_props) 通过设定bbox参数来完成,
    #方式二:
text_01=plt.text()  #首先返回文本对象
Text_01.set_bbox1(bbox_props)

640?wx_fmt=other

注意:bbox接受字典类型的参数,在字典设置边框的属性,其中boxstyle表示边框的样式,常见的有两种 round表示圆角矩形,rarrow表示向右的箭头,还有以下几种,如larrow(表示向左的箭头)  round4 roundtooth sawtoothsquare,circle其实每一种都对应于一个类,

matplotlib的文本及注释
matplotlib的注释annotation

3.2


 #两种设置方式均可,即
 #方式一:
fig.annotate(s,xy=(3,4),xytext=(3,6))
#方式二:
plt. annotate(s,xy=(3,4),xytext=(3,6))

'''其中,xy表示的是注释插入的位置,s表示的是文本的内容,xytext表示的是注释的文本的位置,还有一些常见的可选参数如下:
其他的一些常用参数如下:
 xycoords : 箭头所使用的坐标系
            'figurepoints'   points from the lower left ofthe figure
            'figure pixels'     pixels from the lower left of the figure
            'figure fraction'   fraction of figure from lower left
            'axes points'      points from lower left corner of axes
            'axes pixels'       pixels from lower left corner of axes
            'axes fraction'     fraction of axes from lower left
           'data'          use the coordinate system of theobject being annotated (default)
            'polar'          (theta,r) if not native 'data'coordinates
  textcoords : 文字所使用的坐标系
            'offsetpoints'    offset (in points) from thexy value
            'offsetpixels'     offset (in pixels) from thexy value
                                defaults  to the input of xycoords(默认的和xycoords一样)
bbox:设置注释文字的边框,同上面的文本text是一样的。
arrowprops : 箭头样式设置,必须是字典类型的
            width   the width of the arrow in points
            headwidth   the width of the base of the arrowhead in points
            headlength  the length of the arrow head in points
            shrink       fraction of total length to 'shrink'from both ends
            color  设置颜色
            arrowstyle  设置箭头样式
            connectionstyle设置箭头和文本连接的样式
            connectionstyle的取值可以为(angle  angle3    arc  arc3 bar )
              arrowstyle 的取值可以为('-'   '->'  '-['   '|-|'  '-|>'  '<-'  '<->'  '<|-'
                                                             '<|-|>'   'fancy'  'simple'  'wedge')
'''

Next

四、 matplotlib的高级绘图

640?wx_fmt=other

(1)  处理文本中所涉及到的各种数学符号和数学表达式,LaTeX语法

(2)路径的相关操作

            import matplotlib.patches as ptch

            import matplotlib.path

            import matplotlib.patheffects

            主要是这三者的一个使用或者是结合起来使用

(3)自定义配置文件和画图风格(参见我的另一篇博文:matplotlib教程之——自定义配置文件和绘图风格(rcParams和style)

(4)关于后续的patches绘图,后续会继续讲解,请关注!


全文总结

本文主要的内容包含以下几个部分:

(1)matplotlib图形的组成以及画图的一般步骤

(2)针对画图的五大核心模块,进行介绍,分别用多种方式都可以实现

(3)介绍matplotlib的文本绘制以及注释

END

往期回顾

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值