Python可视化 | 子图中(subplot)的几种设置方法

好奇心Log 今天

以下文章来源于阿宗的科研备忘 ,作者阿宗的科研备忘

阿宗的科研备忘科研备忘录

我们初学Python的时候,想画张图出来还是不难的,导入matplotlib之后,直接选择相应的绘图函数作图就可以了。网上也有很多现成的绘图示例,可以学习借鉴(抄抄代码)。

但是,我们的甲方or领导or老师or审稿人or Others,最喜欢把很多张子图放到一张大图里对比着看了呢!所有没有办法,我们也得掌握绘制子图的技能。这样的绘图过程,在Python上叫作subplot,在NCL上叫作panel。
NCL中进行panel的方法是设置plot的数量,然后针对每张图片进行属性的设置,最终通过gsn_panel函数把它们排布在一起。
我们要用Python中matplotlib绘图库实现panel的话,首先要厘清几个概念。比如plt、subplot、fig、ax等都跟绘图有关,却又很抽象,让人不是很好理解。我一开始经常不知道在设置每张子图的坐标系,或者是添加legend、title的时候,到底应该用谁来点。是plt.xticks(),还是fig.xticks(),还是ax.xticks()呢?
这个时候,就要祭出传说中最厉害的穷举法了!一个个试,试到不报错为止

这里先给出一段最简单的绘制折线的代码:
    import matplotlib.pyplot as pltx = [1,2,3,4]y = [1,0,2,4]fig = plt.figure()ax = fig.add_subplot(1,1,1)plt.plot(x, y)plt.savefig('example.png')
    出图效果如下:
    从这张图片能看出来,图片的四周存在着较大的空白,对于出图效果的美观程度存在一定的影响。NCL中直接绘制png图片时也会出现类似的问题,解决方案为先用NCL绘制eps矢量图,然后再convert成png图片,就能去除图片中的白边了。详见下文:
    如何去除NCL生成的png图片中的白边?
    而Python就更直接啦,只要在plt.savefig()中设置bbox_inches='tight'就可以去除白边了。此外,还可以通过dpi的设置来调整图片的大小。
      plt.savefig('example.png',dpi=300,bbox_inches='tight')
      完美~
      突然发现1024画出来是个√,真是个好数字呢

      回过头来看代码。其实,最开始的这句import已经告诉了我们plt是啥:
        import matplotlib.pyplot as plt
        它是我们将matplotlib.pyplot导入之后,给它起的简称,毕竟matplotlib.pyplot这个名字也太长了。。它是matplotlib下的绘图函数集合,并且出图风格和MATLAB比较相似。也就是说,plt是一个绘图包。
        而下面代码中的fig则是利用plt绘图包里的figure函数创建的一个空白画布,ax则是这张画布中的一个子图。只不过fig.add_subplot(1,1,1)表示的是这个名为fig的空白画布中,总共有1行,1列,ax为其第1个子图。
          fig = plt.figure()ax = fig.add_subplot(1,1,1)
          搞清楚这些概念,我们就可以愉快地开始panel了!假设我们要画4张均匀分布于画布中的子图:
            import matplotlib.pyplot as pltplt.rcParams['font.size'] = 12    #设置默认字号x = [1,2,3,4]y = [1,0,2,4]fig = plt.figure()ax1 = fig.add_subplot(2,2,1) #或:plt.subplot(2,2,1)plt.plot(x, y)plt.title('a) ')  ax2 = fig.add_subplot(2,2,2) # 或:plt.subplot(2,2,2)plt.plot(x, y)plt.title('b) ',fontsize=14,color='blue')ax3 = fig.add_subplot(2,2,3) # 或:plt.subplot(2,2,3)plt.plot(x, y)plt.title('c) ',fontsize=16,color='red',loc='left',bbox=dict(facecolor='y', edgecolor='blue', alpha=0.65 ))ax4 = fig.add_subplot(2,2,4) # 或:plt.subplot(2,2,4)plt.plot(x, y)plt.title('d) ',fontsize=18,color='green',rotation=45)plt.savefig('example.png',dpi=300,bbox_inches='tight')
            这里不管是写成ax1=fig.add_subplot(2,2,1),还是直接写为plt.subplot(2,2,1)的形式,都表示接下来使用的plt绘图包中的函数,都是针对子图subplot(2,2,1)进行的设置,而并非整个画布fig。比如我们上面对各个子图的标题都进行了不同的设置,也都分别作用到了子图,而不是所有图片上。这里出图效果如下:
            除了以上这种方法,我们也可以通过对子图的轴进行操作的方法来实现上面这张图同样的效果:
              import matplotlib.pyplot as pltimport numpy as npimport pandas as pdplt.rcParams['font.size'] = 12    # 设置默认字号x = [1,2,3,4]y = [1,0,2,4]data = pd.Series(np.array(y),index=x)fig,axes=plt.subplots(2,2) data.plot(ax=axes[0,0])axes[0,0].set_title('a) ')data.plot(ax=axes[0,1])axes[0,1].set_title('b) ',fontsize=14,color='blue')data.plot(ax=axes[1,0])axes[1,0].set_title('c) ',fontsize=16,color='red',loc='left',bbox=dict(facecolor='y', edgecolor='blue', alpha=0.65 ))data.plot(ax=axes[1,1])axes[1,1].set_title('d) ',fontsize=18,color='green',rotation=45)plt.savefig('example.png',dpi=300,bbox_inches='tight')
              注意嗷!!这里的用法是axes[m,n].set_title, 以及set_xticks, set_yticks这种set开头的都是和axes[m,n]配套的,plt.的是titile,xticks,yticks这种没有set开头的。混用是会报错的哦

              有些时候,我们也会遇到不规则划分的情况,可以通过指定画布的具体位置来添加子图,比如我在这篇文章(如何用Python画站点雪花图?)中定位子图的方法:

                fig=plt.figure(figsize=[5.5,5],dpi=300)plt.subplots_adjust(top=0.95, bottom=0.05, right=0.85, left=0.05, hspace=0, wspace=0)
                这个方法有个肉眼可见的缺点:位置实在是太难定了,需要试无数次,眼睛都快调瞎了。。而且讲真,你自己摆的还不一定比默认的好看。所以,如果我们有3张图,甲方非要你以上面两张,下面一张的形式来放。那么subplot()应该怎么设置呢?
                一直以来,很多人(当然包括我寄几,我向来都是推己及人的

                )都有个误解,以为subplot只能处理1×n,n×n,n×1这几种情况,硬要画3张图,就会出现第4张子图空白,而不是第3张子图占满第3、4张子图所在位置的情况。就像这样:

                这是我们长久以来受NCL中gsn_panel的思维定势的影响,以为对于画布的划分是一成不变的,而在subplot()函数中,它是可以随用随划分的啊!
                subplot(numRows,numCols,plotNum):表示将画布按照numRows行、numCols列划分后的第plotNum张图片。所以,如果我们想让上图中的图c)占满下面一整行的图片,只要将图c)的subplot设置为(2,1,2)即可,也就是图c)是将画布fig进行2行,1列的划分之后的第2张图片。整个代码可以这样写:
                  import matplotlib.pyplot as pltplt.rcParams['font.size'] = 12    #设置默认字号x = [1,2,3,4]y = [1,0,2,4]fig = plt.figure()plt.subplot(2,2,1)plt.plot(x, y)plt.title('a) ')plt.subplot(2,2,2)plt.plot(x, y)plt.title('b) ',fontsize=14,color='blue')plt.subplot(2,1,2)plt.plot(x, y)plt.title('c) ',fontsize=16,color='red',loc='left',bbox=dict(facecolor='y', edgecolor='blue', alpha=0.65 ))plt.savefig('example.png',dpi=300,bbox_inches='tight')
                  出图效果鹅妹子~~嘤!!!
                  不看的原因确定内容质量低不看此公众号
                  (0)

                  相关推荐

                  • 第91天:Python matplotlib introduction

                    今天我们一起来探究 Python 中一个很有趣的模块--Matplotlib,Matplotlib 是一个非常优秀的 Python 2D 绘图库,只要给出符合格式的数据,通过 Matplotlib 就 ...

                  • 爱了!Python 动态图表太太太秀了

                    本文转自:法纳斯特,作者:小F 关于动态条形图,小F以前推荐过「Bar Chart Race」这个库.三行代码就能实现动态条形图的绘制. 有些同学在使用的时候,会出现一些错误.一个是加载文件报错,另一 ...

                  • matplotlib作图之注释

                    不写python的日子每天都觉得没啥意思,重新搞起~ matplotlib中图的注释 直接上代码看例子: import numpy as np import matplotlib.pyplot as ...

                  • Matplotlib 绘图可视化时 正确显示中文的四种方式

                    Matplotlib是 Python 优秀的数据可视化第三方库,matplotlib是基于 numpy 的一套 Python 工具包.这个包提供了丰富的数据绘图工具,主要用于绘制一些统计图形. Mat ...

                  • 纯干货:手把手教你用Python做数据可视化(附代码)

                    作者:Wes McKinney本文摘编自<利用Python进行数据分析>第2版matplotlib是一个用于生成出版级质量图表(通常是二维的)的桌面绘图包.该项目由John Hunter于 ...

                  • matplotlib pyplot 画图基础教程

                    用Python绘制图表在工作中是一项非常有用的技能,虽然说强大的matlab基本可以满足我们所有的绘图需求,但是在有些情况下,使用Python绘图,让图表直接可以直接随着Python程序的运行而产生. ...

                  • python——画图之seaborn学习——折线图和柱形图的组合。

                    2019-04-15 19:06:01  随风而逝* 码龄3年 关注 1.现在想把两列数据通过折线图和柱形图组合到一张图上来表示,类似下图: 2.具体代码如下: import seaborn as s ...

                  • 如何使用Celluoid制作可视化动画

                    Celluoid可以简化matplotlib生成可视化动画的代码量,Celluoid会先生成一个画布,然后每隔一段时间对绘图进行拍照(帧),最后将所有的帧合并. 今天讲三个例子 单图 多图 图例 安装 ...

                  • 初中物理学习中常用的几种解题方法

                    初中物理学习中常用的几种解题方法

                  • 项目整合管理中常用的2种思考方法

                    作者:谷雨 编辑:环环 *以下正文* 整合管理又叫整体管理,顾名思义,就是从头到尾.自始至终. 也就是说整合管理会涉及所有的知识领域以及五个过程组.全程涉及资源分配.计划更新.变更控制.各阶段衔接过渡 ...

                  • 中医反治法是治疗疾病中不可忽视的一种有效方法

                    反治,是顺从疾病假象而治的一种治疗法则.即采用方药或措施的性质顺从疾病的假象,与疾病的假象相一致,故又称"从治".究其实质,是在治病求本法则指导下,针对疾病的本质而进行治疗的方法, ...

                  • 在中医中,有一种诊疗方法叫“方随法出,法...

                    在中医中,有一种诊疗方法叫"方随法出,法从证立". 与"方证对应"的方法比较,这种方法灵活性强,适应性广,能够应对许多复杂的.全新的局面. 我有一个从事中医妇科 ...

                  • 在中医中,有一种诊疗方法叫“方随法出,法从证立”。

                    与"方证对应"的方法比较,这种方法灵活性强,适应性广,能够应对许多复杂的.全新的局面. 我有一个从事中医妇科的医师朋友,用的是这种方法,她的患者很多,疗效很好,但是她从来不用&qu ...

                  • 厉害了,Spring中bean的12种定义方法!

                    前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...

                  • 导数压轴中常用的两种放缩方法

                    2017全国三卷理21(2) 高考真题演义 . 解 两边取对数,把乘积形式,转化为求和形式: (2012厦门质检) . 解 将不等式的右边常数2,转化为无穷等比数列,是关键: 加强命题 证毕

                  • 足球技巧 | 实战中常用的五种传球方法

                    今天我们将向你展示实战中常用的五种传球方法,喜欢的小伙伴记得支持,分享给朋友共同提高! 过顶挑传 过顶挑传时,用你的脚趾撞击球下面的区域,这样可以让球带有一定的旋转,从而越过防守球员的头顶: 这个传球 ...

                  • 王羲之《兰亭序》中常见的三种起笔方法

                    王羲之<兰亭序>中常见的三种起笔方法 启明按:因为不少书友提到李炯峰老师的点评里很多次提到起笔.行笔.收笔的概念,但是很多书友搞不明白李老师多次强调起笔.行笔.收笔的意义何在,今天启明就分 ...