文章目录

  • 一、分析
    • 1、分辨率
    • 2、子图排布
    • 3、常用的绘图语句
  • 二、代码实现过程
  • 三、实验结果

一、分析

当有很多幅图的时候,怎样让多图的排版更加美观呢?特别是在不知道图的数量的时候,因为之前玩Matlab的时候,遇到过类似的问题(Matlab 让多图排版更美观),所以笔者有充足的信心可以得到让自己满意的答案,下面一起来研究一下。

1、分辨率

我们的电脑一般横竖分辨率为

它们的比例一般为1:1~1:2其实范围更小,并且电脑屏幕的物理横竖比为16:9=1.78:1(通常所说的电脑尺寸就是对角线的长度,1英寸=2.54厘米)。另外这里补充一点DPI的知识:

  • DPI(Dots Per Inch,每英寸点数)是一个量度单位,用于点阵数码影像,指每一英寸长度中,取样、可显示或输出点的数目。
  • 鼠标的DPI:每英寸鼠标采样次数。明白讲,就是鼠标移动一英寸,鼠标自己能够从移动表面上采集到多少个点的变化。
  • 显示器DPI:每英寸像素点的个数,比如我的屏幕分辨率为2560*1440,屏幕物理尺寸为14寸=6.86寸*12.2寸,那么我横竖每寸像素点的个数均为275,即我的显示器DPI为275
  • 图像DPI:图像的DPI的含义是每寸的像素数,web上的图片一般都是72DPI,DPI越高,扫描清晰度越高,一般照片冲洗必须为300+DPI
  • 印刷DPI:DPI原来是印刷上的记量单位,意思是每英寸上,所能印刷的网点数(Dot Per Inch)。但随着数字输入,输出设备快速发展,大多数的人也将数字影像的解析度用DPI表示,但较为严谨的人可能注意到,印刷时计算的网点(Dot)和电脑显示器的显示像素(Pixel)并非相同,所以较专业的人士,会用PPI(Pixel Per Inch)表示数字影像的解析度,以区分二者。
  • 4k 影视:横向像素数有几个1024就称为几k,4k就是一行有4096个像素点,我们通常看的高清电影的分辨率也就1920×1080

2、子图排布

所以,如果将横竖子图个数的比例控制在1:1~1:2这个比例区间,那么看起来就会『神清气爽』,下面列一个表格:

子图总数量 行 × 列
1 1×1
2 1×2
3:4 2×2
5:6 2×3
7:8 2×4
9 3×3
10:12 3×4
13:15 3×5
16 4×4
17:18 3×6
19:20 4×5
21:24 4×6
25 5×5
26:28 4×7
29:30 5×6
31:32 4×8
33:35 5×7

这个表格的处理可能也并不是特别好,暂且就这么搞。并且,一幅图中的子图数量不可能一直变多,实在不行就搞两张,三张,干嘛非得挤到一起!

3、常用的绘图语句

笔者在 Python 中绘图经常使用的一句话如下:

fig=plt.figure(figsize=(12,6),dpi=100,facecolor='w')

其中

  • figuresize 控制的是图像的大小,它的单位为英寸,12,6代表图像宽12英寸,高12英寸
  • dpi就是指图像的分辨率,上面已经有所解释,即每英寸像素点的个数,它的值越大,代表图像越清晰,相应的保存下来图像的大小也越大
  • facecolor 图的底色

还有其他的语句:

# 控制坐标轴上小短线的大小和方向,控制坐标轴刻度标注的大小
ax1.tick_params(axis='both', colors='black', direction='out', labelsize=15, width=1, length=1, pad=5)

二、代码实现过程

首先根据子图总数量确定行列数:

def nfigure2ab(num):"""get the number of row and cloum according to the number of sub-figure> @param[in] num:           the number of sub-figurereturn:     < @param[out] a             the number of the row< @param[out] b             the number of the cloum"""if num==1:a=1;b=1elif num==2:a=1;b=2elif num>2 and num<=4:a=2;b=2elif num>4 and num<=6:a=2;b=3elif num>6 and num<=8:a=2;b=4elif num==9:a=3;b=3elif num>9 and num<=12:a=3;b=4elif num>12 and num<=15:a=3;b=5elif num==16:a=4;b=4elif num>16 and num<=18:a=3;b=6elif num>18 and num<=20:a=4;b=5elif num>21 and num<=24:a=4;b=6elif num==25:a=5;b=5elif num>25 and num<=28:a=4;b=7elif num>28 and num<=30:a=5;b=6elif num>30 and num<=32:a=4;b=8elif num>32 and num<=35:a=5;b=7else:print('The number is too large!')a=0;b=0return a,b

根据上面的小函数暂且画一下:

def test(num):a,b=nfigure2ab(num)fig=plt.figure(figsize=(12,6),dpi=100,facecolor='w') for i in range(num):plt.subplot(a, b, i+1)test(15)
plt.show()


看起来还可以,这个比Matlab要好多了,Matlab子图与子图之间的间距非常大,还得人为去调整。虽然Python不用调整间距,但是它还有一些其他问题,比如:刻度字体太小,子图之间不想让显示刻度,只让边缘的子图显示刻度和刻度标注。经过一番改良,代码如下:

def test(num):a,b=nfigure2ab(num)fig=plt.figure(figsize=(12,6),dpi=100,facecolor='w') for i in range(num):ax=plt.subplot(a, b, i+1)ax.tick_params(axis='both', colors='black', direction='out', labelsize=15, width=1, length=1, pad=5)if math.ceil((i+1)/b)!=a:plt.xticks([])if i%b!=0:plt.yticks([])test(15)
plt.show()


至此,大功告成

三、实验结果

这部分对第二部分精简一下,将得到的结论(结果)汇总整理,以便以后快速使用。

def nfigure2ab(num):"""get the number of row and cloum according to the number of sub-figure> @param[in] num:           the number of sub-figurereturn:     < @param[out] a             the number of the row< @param[out] b             the number of the cloum"""if num==1:a=1;b=1elif num==2:a=1;b=2elif num>2 and num<=4:a=2;b=2elif num>4 and num<=6:a=2;b=3elif num>6 and num<=8:a=2;b=4elif num==9:a=3;b=3elif num>9 and num<=12:a=3;b=4elif num>12 and num<=15:a=3;b=5elif num==16:a=4;b=4elif num>16 and num<=18:a=3;b=6elif num>18 and num<=20:a=4;b=5elif num>21 and num<=24:a=4;b=6elif num==25:a=5;b=5elif num>25 and num<=28:a=4;b=7elif num>28 and num<=30:a=5;b=6elif num>30 and num<=32:a=4;b=8elif num>32 and num<=35:a=5;b=7else:print('The number is too large!')a=0;b=0return a,bdef test(num):a,b=nfigure2ab(num)fig=plt.figure(figsize=(12,6),dpi=100,facecolor='w') for i in range(num):ax=plt.subplot(a, b, i+1)ax.tick_params(axis='both', colors='black', direction='out', labelsize=15, width=1, length=1, pad=5)if math.ceil((i+1)/b)!=a:plt.xticks([])if i%b!=0:plt.yticks([])
test(15)
plt.show()

Python 让多图排版更加美观相关推荐

  1. html显示多张照片的布局,多图片如何排版?手把手教你多图排版布局

    确实,当我们遇到很多图片时,总是容易被排版困住,不知道该如何更好的处理图片布局 不要慌,稿叔今天就和大伙分享我在排版时经常参考的案例,同时还有5个关于排版的技巧以及多图排版神器一并送上,希望能够帮助到 ...

  2. python 动图_历时 1 个月,做了 10 个 Python 可视化动图,用心且精美...

    最近1个月,我使用Python绘图库pyecharts,画了十类图,在这里总结一下.同时,我始终相信: 慢工出细活,做一个成一个,不急不躁,不管外面的世界有多浮躁,只要内心坚定,外界打扰都是浮云. 1 ...

  3. Python将彩色图转换为灰度图

    Python将彩色图转换为灰度图 目录 Python将彩色图转换为灰度图 #原图 #转化程序 #处理后的图片

  4. python使用箱图法和业务规则进行异常数据处理并检查预测使用的数据特征是否有字段缺失的情况并补齐

    python使用箱图法和业务规则进行异常数据处理并检查预测使用的数据特征是否有字段缺失的情况并补齐 关于预测或者推理的时候特征补齐的情况是这样的: 你在模型训练的时候使用了多少特征,那么在模型预测和推 ...

  5. python多张图片合并拼接,python制作sprite图、雪碧图

    python多张图片合并拼接,python制作sprite图.雪碧图 整理图片集 找两个文件夹,yangying和zhaoliying,分别放上照片8张,共16张照片. 创建sprite.py # 多 ...

  6. python opencv 彩色图非局部平均去噪

    python opencv 彩色图非局部平均去噪 代码: import cv2 import numpy as np # 灰度图像去噪 def MeansDenoising(img,N,h,templ ...

  7. python opencv 灰度图非局部平均去噪

    python opencv 灰度图非局部平均去噪 代码: import cv2 import numpy as np # 灰度图像去噪 def MeansDenoising(img,h,templat ...

  8. 修改python plot折线图的坐标轴刻度

    修改python plot折线图的坐标轴刻度,这里修改为整数: 代码如下: from matplotlib import pyplot as plt import matplotlib.ticker ...

  9. python简单代码画曲线图教程-Python绘制折线图和散点图的详细方法介绍(代码示例)...

    本篇文章给大家带来的内容是关于Python绘制折线图和散点图的详细方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.绘制折线图和散点图要用到matplotlib ...

  10. python话雷达图-Python 详解雷达图/蛛网图

    雷达图-pyecharts 蛛网图,最早知道是在玩FIFA游戏的时候,球员的能力用蛛网图来表示与比较,那时觉得非常新鲜.后来,在实际的工作中,其实很少用到:一方面,直接提供蛛网图的工具少:另一方面,过 ...

最新文章

  1. [导入]使用RDLC报表(一)
  2. 高并发编程-Thread_正确关闭线程的三种方式
  3. Java 多重catch语句的使用
  4. Qt平台和编译器说明-Android
  5. 虚拟化IDC包含的业务内容
  6. 学习数据库的三大范式
  7. 税收与补贴问题(洛谷-P1023)
  8. Java多线程:解决生产者/消费者模式
  9. oracle 调用存储过程返回集合插入临时表_技术分享:集合
  10. iOS 入门——Hello World app
  11. 问题二十一:怎么模拟ray tracing图形中不同材料的颜色(diffuse and metal)
  12. 力扣-509 裴波那契数
  13. 利用反射机制,多个请求对应一个Servlet!附源代码
  14. 【工业智能】天泽智云带你解读工业智能热门科技 – 大数据、工业互联网、云计算、边缘计算、CPS
  15. 基于内外环PD控制的四旋翼飞行器控制系统simulink仿真
  16. AXI总线简介(二)
  17. Linux:UID和EUID
  18. 为什么单片机只有可以整除8的特殊寄存器能够位寻址?
  19. 大数据与云计算网课答案
  20. ERROR: Error in Log_event::read_log_event(): ‘Sanity check failed‘, data_len: 67, event_type: 35

热门文章

  1. OpenGL学习例程精析(3d纹理)
  2. php eot html,PHP eot
  3. 如何讲好FISHER确切概率法
  4. GameCenter 使用指南
  5. 【工作规划】未来自我学习计划及发展注意事项
  6. 2015年阿里实习经历
  7. 如何用极路由+OpenWrt+RTL电视棒搭建一台SDR服务器,并隐秘地捕获和传输数据
  8. 绝不要用的 Linux 命令 !
  9. 腾讯游戏安全高级工程师胡和君:定制化对抗——游戏反外挂的安全实践
  10. Hunger Snake