介绍

我们写了一款小工具,用于将数据通过python转化为matlab绘图代码。

该函数通过设置x数据、y数据、图例(legend)、x轴标签(xlabel)、y轴标签(ylabel)等属性,通过属性的定制,最终生成定制的matlab脚本文件。

目前暂时实现了plot(折线图)和bar(柱状图)功能。

代码库:matlab_plot: 通过python,将数据展示变为matlab绘图代码 (gitee.com)

代码编写思路

核心文件结构

所有的核心代码均放在plt_utils文件夹中,使用时可直接复制到自己的项目中,具体的使用说明可以看runner.py。 plt_utils文件夹内文件说明:

  • depresed:这个文件夹下存放的都是过期文件,不使用
  • abstract_gen_mode.py:里面存放抽象类,采用模板方法模式进行编写,定义代码生成流程函数(plot()),其中,抽象方法(gen_matlab_plot_code())由子类实现,以提供不同的功能。
  • base_matlab_attribute.py:这个文件夹下存放matlab画图的基本属性,比如:颜色、窗口大小、x数据,y数据等。
  • constant.py:这个文件夹下存放的是定义的常量
  • plot_mode.py:里面存放具体的实现类,包含Plot_script和Bar_script
  • utils.py:定义一些静态方法,供类使用

编写过程

代码的编写过程采用模板方法模式,通过自定义模板后,其他扩展类可通过实现gen_matlab_plot_code()方法实现主要的代码编写脚本。

模板类放在plt_utils.abstract_gen_mode.py文件中,具体为Abstract_gen_code类。在类中,我们定义好了模板方法plot(),在代码中,具体代码为:

def plot(self, filename=None, is_delete=True):
    if filename is None:
        filename = self.get_matlab_script_path()
    if is_delete:
        utils.delete_file_if_exist(filename)
        self.check_status()
    with open(filename, "w+", encoding=CONSTANT.UTF_8) as f:
        # 生成文档信息
        self.__gen_pre_info(f)
        # 生成文档通用信息
        self.__gen_pre_general_variable(f)
        # 核心代码生成
        self.gen_matlab_plot_code(f)
        # 生成文档通用信息后续
        self.__gen_after_general_command(f)
        # 生成保存图片命令
        self.__save_fig(f)

后续,折线图类(Plot_script)继承Abstract_gen_code类,实现gen_matlab_plot_code()方法即可。同理,柱状图类(Bar_script)继承Abstract_gen_code类。

使用说明

需要将plt_utils文件夹放到自身的项目中,具体的运行方式在runner.py中,可参考runner.py编写代码。

演示过程

我们以下面这段代码为例:

ps = Plot_script()
y = np.random.random((3, 10))
x = [i for i in range(10)]
# 设置x数据和标签
ps.set_x(x).set_x_label("this is xlabel.")
# 设置y数据和标签
ps.set_y(y).set_y_label("this is ylabel.")
# 设置图例
ps.set_legend(["a", "b", "c"])
# 设置图例位置
ps.set_legend_position("East")
# 设置x轴显示范围与数据x对应
ps.set_fix_x_axis(True)
# 添加点的步长
ps.set_marker_indices(3)
ps.set_line_width(4)
# 设置图例窗口的位置
ps.set_relative_location_bottom(0.2).set_relative_location_left(0.2)
ps.set_title("this is title")
ps.plot()

这段代码新生成一个Plot_script对象(这个对象最终生成折线图,若需生成柱状图,则使用Bar_script()),然后设置x,y数据,标签,图例等属性。

在设置完成后,我们运行该代码,即可获得python生成的matlab脚本代码,若不指定生成文件名,则默认在当前文件夹下生成code_by_gen.m名字的matlab脚本,具体如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  生成时间:2023-03-26 10:42:08
%  本文件名:code_by_gen.m
%  生成的结果文件名:result.eps
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 清除命令窗口的内容
clc;
% 关闭所有Figure窗口
close all;


% 通用参数输出
window_size = [0.2, 0.2, 0.4, 0.6];
font_size = 20;
color_matrix = [0.58431373 0.63529412 1.        ; 0.98039216 0.50196078 0.50196078; 1.         0.75294118 0.4627451 ; 0.98039216 0.90588235 0.40784314; 0.52941176 0.90980392 0.52156863; 0.23529412 0.7254902  0.98823529; 0.45098039 0.67058824 0.96078431; 0.79607843 0.60784314 1.        ; 0.2627451  0.2627451  0.28235294; 0.56470588 0.92941176 0.49019608; 0.96862745 0.63921569 0.36078431; 0.50196078 0.52156863 0.91372549];
% 通用参数输出结束


line_width = 4;
market_size = 10;

x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
y = [0.29075421 0.34634219 0.69594728 0.79119567 0.59282558 0.77548865 0.68122863 0.30705789 0.79165212 0.39231803; 0.85210582 0.06844677 0.09253285 0.15129314 0.79088998 0.88056113 0.01281134 0.1188722  0.56499785 0.31218398; 0.87069844 0.09158256 0.20732744 0.23335127 0.34206127 0.18594918 0.97413568 0.43039713 0.5204806  0.88228438];
plot(x, y(1, :), '-+', 'MarkerSize', market_size, 'Color', color_matrix(1, :), 'LineWidth', line_width, 'MarkerIndices', 1:3:length(y(1, :)));
hold on;
plot(x, y(2, :), '-o', 'MarkerSize', market_size, 'Color', color_matrix(2, :), 'LineWidth', line_width, 'MarkerIndices', 1:3:length(y(2, :)));
hold on;
plot(x, y(3, :), '-*', 'MarkerSize', market_size, 'Color', color_matrix(3, :), 'LineWidth', line_width, 'MarkerIndices', 1:3:length(y(3, :)));
hold on;

% x轴坐标限定到x的数据范围大小
xlim([min(x) max(x)])% 网格化
grid on;
xlabel('this is xlabel.');
ylabel('this is ylabel.');
% 设置标签及位置
h1 = legend({'a', 'b', 'c'});
set(h1, 'Location', 'East');
% 设置图像标题
title("this is title");
% 设置全局的字体大小及样式
set(gca, 'fontsize', font_size);
set(gca, 'fontname', 'Times');
% 设置图像的大小和相对位置
set(gcf,'unit','normalized','position', window_size)
% 保存图片到result.eps文件
print result.eps -depsc2 -r600

该文件通过matlab运行后,会生成以下图片:

alt 1679798603007