Python论文多图绘制+代码+代码解读+绘图经验分享(2)


前言

重新看了自己写的上一篇文章,上一篇给出的代码解决的主要论文多图绘制中的小图拼接,且被拼接的小图是已知分布的图线。这里说明,如果我们要解决的问题是对于多个小图进行拼接操作,该如何在上一篇代码的基础上做出改动。


概念补充

  1. lambda函数(匿名函数)
    它是一种快速定义简单函数的方法。其语法是:
lambda arguments: expression

给个简单例子:

add = lambda x, y: x + y
print(add(5, 3))  # 输出8

代码更改部分及原因

  1. 对于图像文件不直接保存在同一个文件夹下的情况
    使用os.list方法查询搜索文件夹,使用。endwidth()方法搜索特定后缀的文件夹。因为我的图像文件是层层嵌套的,图像被放在每个文件下名为.out的文件下,因此之后的完整代码我的循环还要检查一边文件夹内的文件夹,这里可按需删改。
 image_dirs = [d for d in os.listdir(directory) if d.endswith('.out')]

  1. 对于图像文件保存在同一个文件夹下的情况
    首先我们将图像文件保存在一个文件夹下,然后使用一个循环读取文件夹下的文件。这里注意,代码在读文件顺序的时候,不是按照我们以为的1,2,3这样的阿拉伯数字递增的图像名去排列,所以直接默认让代码排列图的顺序的时候会出现乱序。为了解决这个问题,我们使用以下这段代码,这是一段比较通用的排序代码:
def sorted_numeric(data):
    convert = lambda text: int(text) if text.isdigit() else text.lower()
    numeric_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
    return sorted(data, key=numeric_key)

这个函数中,convert和numeric_key首先处理图像文件的名称,转换为能够使用sorted(排序内置函数)函数的形式。
convert 是一个将文本转换为数字的函数,如果文本可以转换为整数(isdigit()返回True),那么它就会转换;否则,它会将文本转换为小写。numeric_key 是一个函数,它使用正则表达式将键(字符串)中的数字和非数字字符分开,并对这些分开的部分应用convert函数。这意味着如果你有一个混合了数字和字母的字符串,它将被拆分成单独的数字和字母部分,然后数字将被转换为整数,字母将被转换为小写。
sorted(data, key=numeric_key):这是Python的内置排序函数,使用numeric_key函数作为关键字排序。
因此我们的图像得以按顺序排列。

完整代码

完整代码如下:

import numpy as np
import os
import re
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from matplotlib.image import imread

plt.style.use('classic')

def sorted_numeric(data):
    convert = lambda text: int(text) if text.isdigit() else text.lower()
    numeric_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
    return sorted(data, key=numeric_key)

def create_subplots(directory, figure_size=(10,10), filename='my_figure.svg'):
    '''创建子图,每个子图显示一个图像'''

    # 获取文件夹中的所有图像文件夹
    image_dirs = [d for d in os.listdir(directory) if d.endswith('.out')]
    image_dirs = sorted_numeric(image_dirs)  # 确保文件夹按照数字顺序排序

    # 创建图形和子图
    fig = plt.figure(figsize=figure_size)
    n = len(image_dirs)
    num_rows = int(np.ceil(np.sqrt(n)))
    num_cols = int(np.ceil(n / num_rows))
    gs = GridSpec(num_rows, num_cols, figure=fig)

    for i, image_dir in enumerate(image_dirs):
        # Assume that each directory contains exactly one image file
        image_file = os.path.join(directory, image_dir, f"{i}.png")

        ax = fig.add_subplot(gs[i // num_cols, i % num_cols])

        # Load and display the image
        img = imread(image_file)
        ax.imshow(img)
        
        # Adding information to each plot
        ax.set_title(f'figure {i+1}') # 小标题
        ax.axis('off')  # 隐藏坐标轴

    # Remove unused subplots
    for j in range(n, num_rows*num_cols):
        fig.delaxes(fig.add_subplot(gs[j // num_cols, j % num_cols]))

    # 保存图形,使用SVG格式和300 dpi的分辨率
    plt.savefig(filename, format='svg', dpi=300)

    # 显示图形
    plt.show()

调用方式:

create_subplots(' 存图的文件路径', figure_size=(10,10), filename='名字.svg')

代码评估

接下来思考一下这段代码是否足够灵活。以下是其功能及可以更改的部分:

  1. 合并上一篇文章的代码,这段代码能够处理特定分布的小图拼接的多图绘制情况,也能够处理多个嵌套文件夹下的图的读取绘制。
  2. 关于画图,我们将画图的代码封装成函数,因此,我们只需输入文件夹的路径,和我们需要画的画布的大小,以及要保存的格式,推荐拉伸不会变形的svg格式,不然png格式会在拉伸后清晰度发生变化。这种封装的形式会使得代码简洁,调用方便。
  3. 关于图的细节,则需要进入函数内部更改,如标题,小标题,是否隐藏坐标轴,风格,字体等等。后期的话会再出一些折线图等的绘图,按照本人的审美来设计绘制,这样的话,每次写论文我们就将数据保存,然后直接运行代码来绘图即可。

综上,这部分代码可以重复使用,觉得总结没白费!!耶斯!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于多种深度学习的故障检测算法python源码+项目说明 【资源介绍】 该代码主要参考论文代码放在最后,主要用来研究和学习一些有关故障检测的深度学习算法和CWRU轴承数据集 也对该代码进行了通读和理解,并对其进行了简单的改造,也添加了一些可视化的代码 Overall introduction AE_Datasets:自编码器的三种数据预处理方式的相关代码 CNN_Datasets:卷积神经网络的三种数据预处理方式的相关代码 checkpoint:存放的是不同网络训练过程的日志(这里存放的是我当时跑训练模型时的日志信息) logs:存放的是训练集和验证集训练过程的各种指标(准确率、精确率、召回率、误报率、漏检率、F1值、Loss值)的数据(使用tensorboard就可以可视化) models:放置各种不同的网络模型的代码 utils:包含训练过程的一些函数 draw_models.py:对各个模型的训练集和验证集的ACC和LOSS进行绘图可视化的代码 draw_transform.py:对CWRU数据集的数据进行各种变换分析(CWT和STFT(汉宁窗)),并绘图进行可视化的代码 train.py:训练除自编码器的网络模型的代码 train_ae.py:训练自编码器的网络模型的代码 Add 在train_utils.py和train_utils_ae.py的train函数中:增添了tensorboard可视化,增加了训练中的指标精确率、召回率、误报率、漏报率 增添了draw_models.py和draw_transform.py feelings 在故障检测的这个项目中,通过该代码的研读也对多种网络模型有了较为深刻的理解,也对pytorch的这套深度学习整体框架有了很多的了解,自己也对CWRU数据集进行了很多次的训练,也得出了对于适用于CWRU数据集故障检测的很棒的模型和数据输入。
下面是使用matplotlib和turtle库绘制多啦爱梦形的示例代码及备注: 使用matplotlib绘制静态形: ```python import matplotlib.pyplot as plt # 绘制身体 body = plt.Polygon([(0, 0), (1, 0), (1, 3), (0, 3)], color='blue') # 绘制头部 head = plt.Circle((0.5, 4), radius=1, color='yellow') # 绘制眼睛 left_eye = plt.Circle((0.3, 4.5), radius=0.2, color='white') right_eye = plt.Circle((0.7, 4.5), radius=0.2, color='white') pupil_left = plt.Circle((0.3, 4.5), radius=0.1, color='black') pupil_right = plt.Circle((0.7, 4.5), radius=0.1, color='black') # 绘制鼻子 nose = plt.Polygon([(0.4, 4.2), (0.6, 4.2), (0.5, 4.4)], color='black') # 绘制胡须 whiskers_left = plt.Polygon([(0.2, 4.1), (0.2, 4.3)], color='black') whiskers_right = plt.Polygon([(0.8, 4.1), (0.8, 4.3)], color='black') # 创建画布 fig, ax = plt.subplots() # 添加形到画布 ax.add_artist(body) ax.add_artist(head) ax.add_artist(left_eye) ax.add_artist(right_eye) ax.add_artist(pupil_left) ax.add_artist(pupil_right) ax.add_artist(nose) ax.add_artist(whiskers_left) ax.add_artist(whiskers_right) # 设置坐标轴范围 ax.set_xlim([-1, 2]) ax.set_ylim([-1, 5]) # 显示形 plt.show() ``` 备注: - 使用matplotlib库需要先导入库文件,即`import matplotlib.pyplot as plt` - Polygon()和Circle()函数用于绘制多边形和圆形,其中第一个参数是坐标或中心坐标,radius是半径或宽高,color是颜色。 - 创建画布可以使用subplots()函数,返回的是一个元组,包含画布和子的对象,即fig, ax = plt.subplots() - 添加形到画布可以使用add_artist()函数 - 设置坐标轴范围可以使用set_xlim()和set_ylim()函数 - 最后使用show()函数显示形 使用turtle库绘制多啦爱梦形: ```python import turtle # 创建画布 t = turtle.Pen() # 绘制身体 t.fillcolor('blue') t.begin_fill() t.forward(100) t.left(90) t.forward(300) t.left(90) t.forward(100) t.left(90) t.forward(300) t.end_fill() # 绘制头部 t.penup() t.goto(50, 300) t.pendown() t.fillcolor('yellow') t.begin_fill() t.circle(100) t.end_fill() # 绘制眼睛 t.penup() t.goto(20, 350) t.pendown() t.fillcolor('white') t.begin_fill() t.circle(20) t.end_fill() t.penup() t.goto(80, 350) t.pendown() t.fillcolor('white') t.begin_fill() t.circle(20) t.end_fill() t.penup() t.goto(30, 370) t.pendown() t.fillcolor('black') t.begin_fill() t.circle(10) t.end_fill() t.penup() t.goto(90, 370) t.pendown() t.fillcolor('black') t.begin_fill() t.circle(10) t.end_fill() # 绘制鼻子 t.penup() t.goto(40, 330) t.pendown() t.fillcolor('black') t.begin_fill() t.goto(60, 330) t.goto(50, 350) t.goto(40, 330) t.end_fill() # 绘制胡须 t.penup() t.goto(10, 320) t.pendown() t.goto(90, 320) t.penup() t.goto(10, 310) t.pendown() t.goto(90, 310) t.penup() t.goto(10, 300) t.pendown() t.goto(90, 300) # 隐藏画笔 t.hideturtle() # 显示形 turtle.mainloop() ``` 备注: - 使用turtle库需要先导入库文件,即`import turtle` - 创建画布可以使用Pen()函数,即t = turtle.Pen() - 绘制身体可以使用fillcolor()和begin_fill()函数设置填充颜色和开始填充,然后使用forward()和left()函数绘制矩形 - 绘制头部可以使用goto()函数移动画笔位置,然后使用fillcolor()和begin_fill()函数设置填充颜色和开始填充,最后使用circle()函数绘制圆形 - 绘制眼睛、鼻子和胡须可以使用goto()函数移动画笔位置,然后使用fillcolor()和begin_fill()函数设置填充颜色和开始填充,最后使用circle()函数绘制圆形或goto()函数绘制线条 - 隐藏画笔可以使用hideturtle()函数 - 最后使用mainloop()函数显示

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值