深入详解matplotlib画图进阶

一、matplotlib的画图步骤以及图形结构

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

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

1、matplotlib的图形组成结构

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

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

2、画图流程


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

二、画图设置的详细实现

    (一)创建图形及创建子图

             1、图形的创建

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

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

           注意:返回的 f 指总得图像,对应那幅图中的第一层对象。

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

设置所有图形总标题:

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

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

            2、 子图创建的三种方式

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

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

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

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

            (4)上面返回的实际上都是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')

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

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


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

            Title

            图像(比如line曲线等)

            Legend

            Grid

            Text

            Annotation

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

           (5)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')

显示结果为:


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

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

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()

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

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

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'

等等

4、标题Title的相关设置

    (1)  两种设置的方式

    方式一: fig1.set_title("这是第一幅图")      #设置标题

    方式二: plt.title('这是第二幅图') 

    (2)其他参数的设置

        loc : {'center', 'left', 'right'},设置标题显示的位置

        pad :float  设置标题距离图像上边缘有多远

        fontsize:设置字体大小,如‘xx-large’

        color='red'设置字体颜色

5、与网格grid相关的设置

         which='major',给主坐标还是次坐标

        axis='x',       只显示哪一个轴或者是两者

        color='r',     颜色

        linestyle='-',   线型

         linewidth=2   线粗

三、文本(Text)以及注释(Annotation)——图形标注的两种方式

(一)文本Text

    两种设置方式均可,即

    方式一: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(boxstyle="rarrow", 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)

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

(二)注释annotate

   两种设置方式均可,即

        方式一: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')

四、高级设置:

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

(2)路径的相关操作

            import matplotlib.patches as ptch

            import matplotlib.path

            import matplotlib.patheffects

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容