MATLAB设置图窗所有文字字体为【中文宋体+英文Times New Roman】
这里写自定义目录标题
- MATLAB设置图窗所有文字字体为【中文宋体+英文Times New Roman】
- 背景
- 实现过程
- 找到图窗所有文字
- 文字切分
- 使用指南
- 案例
- 参考文章
MATLAB设置图窗所有文字字体为【中文宋体+英文Times New Roman】
学位论文的要求图片中英文字体不同,而MATLAB默认只能设置单一字体,参考网上的MATLAB字体设置的文章1 2,设计了个函数figFont(fig)来读取图窗fig上的所有字符,然后将所有中文字体全部修改为宋体,英文字体为Times New Roman。
背景
默认情况下,MATLAB默认字体为Helvetica,中文显示是宋体:
如果设置坐标区字体为宋体,set(gca, ‘FontName’,‘宋体’);,则英文显示很丑:
如果设置坐标区字体为Times New Roman,set(gca, ‘FontName’,‘Times New Roman’),则中文乱码:
在网上浏览相关信息后,对混排字体大体可以分为两个思路:
- 对文本进行切分,补充字体设置。
- MATLAB或者系统底层字体库替换。
由于对底层的知识不太熟,我选择写一个函数对所有文本的字体进行设置。
实现过程
- 找到图窗中的所有文字
- 对文字进行切分
- 对切分后的文字设置字体,然后重组
找到图窗所有文字
图窗fig中的文字内容有两种格式:
- Text文本对象
- Cell元胞数组
找到以上两种元素有两种思路
- 遍历所有元素
- 使用函数findall找Text+遍历每个坐标区找坐标轴相关的Cell元胞数组
文字切分
假设图窗fig中已有文字元素为
'中文内容一 English Content 2 中文内容三 English Content 4'
后,将该段文字切分,并补充字体设置
使得文字内容转化为
'\fontname{宋体}中文内容一 \fontname{Times New Roman}English Content 2 \fontname{宋体}中文内容三 \fontname{Times New Roman}English Content 4'
就能在不更换默认以及系统字体的情况下实现中英文字体混排。
使用指南
把下面的figFont或者figFont3函数保存为.m文件,然后您画好自己的图后,并获得图窗的句柄fig后,在你自己的代码最后,补充以下任意一句内容,即可实现图片字体混排:
figFont(fig);
或
figFont3(fig);
figFont(fig)和figFont3(fig),这俩功能是一样的,读取图窗fig后就会将fig中的所有文字都进行修改,区别在于:
- figFont遍历了图窗中的所有元素;
- figFont3是我把代码再交给通义灵码再次进行优化后写的,只读取图窗中Axes坐标区元素和Text文本元素;
当图窗fig中显示的内容较多,figFont3()运行速度较快,但可能有一些我不知道的文字元素可能需要您使用的时候自己来修改代码。
下面是figFont()函数:
%% 测试 % close all;clear; % % Figure % plot(cos(0:0.01:pi));hold on; % fig=figure(1); % set(fig, 'Name', 'My Figure', 'NumberTitle', 'off', 'MenuBar', 'none'); % title('hfdsaa范德萨’'); % % % 添加一些 Text 对象 % text1 = text(0.5, 0.5, 'Hello哈哈', 'Color', 'red'); % text2 = text(0.6, 0.6, 'World', 'Color', 'blue'); % text3 = text(0.7, 0.7, 'Axes Text', 'Color', 'green'); % % legend('fdsaf') % xlabel('alskk') % % figFont(fig) %% function figFont(fig) % 调用递归函数,从 figure 开始搜索 [textObjects, cellArrays,childArrays,nameArrays] = findTextAndCell(fig); for itxt=1:length(textObjects) % 转化: strChgd={stringChg(textObjects{itxt}.String )}; % 替换: textObjects{itxt}.String =strChgd; end for icel=1:length(cellArrays) % 转化: strChgds={}; for jcel=1:length(cellArrays{icel}) strChgd={stringChg(cellArrays{icel}(jcel))}; strChgds{end+1}=strChgd; end % 替换: set(childArrays{icel},nameArrays{icel},string(strChgds')) end end % 递归函数,用于遍历所有子对象 function [textObjects, cellArrays,childArrays,nameArrays] = findTextAndCell(obj) % 初始化结果变量 textObjects = {}; cellArrays = {}; childArrays={}; nameArrays ={}; % 获取当前对象的所有子对象 children = get(obj, 'Children'); % 遍历所有子对象 for i = 1:length(children) child = children(i); % 检查子对象是否为 Text 对象 if strcmp(get(child, 'Type'), 'text') textObjects{end+1} = child; end % 检查子对象的属性值是否为元胞数组或Text对象 props = properties(child); for j = 1:length(props) propName = props{j}; propValue = get(child, propName); if iscell(propValue) cellArrays{end+1} = propValue; childArrays{end+1} = child; nameArrays{end+1} = propName; end try if strcmp(get(propValue, 'Type'), 'text') textObjects{end+1} = propValue; end end end % 递归调用,继续搜索子对象的子对象 [subTextObjects, subCellArrays] = findTextAndCell(child); textObjects = [textObjects, subTextObjects]; cellArrays = [cellArrays, subCellArrays]; end end function textCont=stringChg(textCont_String) if strcmp(textCont_String,char);textCont=char;else chiFontname='宋体'; engFontname='Times New Roman'; % textCont = string(textObjs.String); % set(textObjs, 'Interpreter', 'tex'); % 设置解释器为 TeX (LaTeX解析式,关键代码"\fontname{}"不会生效) % 中英字段分割 result = splitChinese(textCont_String); % 设置中文字段字体 result.Data(result.flag == 1) = strcat(['\fontname{',chiFontname,'}'],result.Data(result.flag == 1)); % 设置英文字段字体 result.Data(result.flag == 0) = strcat(['\fontname{',engFontname,'}'],result.Data(result.flag == 0)); % 重新连接字符 textCont = [result.Data{:}]; end end function result = splitChinese(label) % 确定汉字的位置 label = char(label); % 目前为多行字符向量(char 1*11*6)形成矩阵,不好串联 log = arrayfun(@(x) (x >= '一' && x =8212&&x=12290&&x=65281&&x:}]; end end function result = splitChinese(label) % 确定汉字的位置 label = char(label); % 检查是否为中文字符 log = arrayfun(@(x) (x = '一' && x = 8212 && x = 12290 && x = 65281 && x :}]; end end function result = splitChinese(label) % 确定汉字的位置 label = char(label); % 检查是否为中文字符 log = arrayfun(@(x) (x = '一' && x = 8212 && x = 12290 && x = 65281 && x
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。