Hola, ha pasado mucho tiempo a todos. Este número trae una recreación de un dibujo, y ya se publicó hasta el día 11. No sé si habrá la posibilidad de romper los ciento un día. Este número es la figura 03 del artículo pnas.2200057120 en la revista "PNAS". El título del artículo es Entrega intranasal de anticuerpo anti-Nogo-A de longitud completa: una ruta alternativa potencial para anticuerpos terapéuticos contra objetivos del sistema nervioso central. Puede descargar el pdf original del artículo en la siguiente URL:
- https://www.pnas.org/doi/epdf/10.1073/pnas.2200057120
El dibujo que se reproducirá en este número se ve así:
El efecto que reproduje se ve así:
Aunque todavía hay algunas diferencias, la mayoría de los elementos han sido restaurados.La siguiente es la parte del tutorial:
Intente utilizar la nueva versión de MATLAB. La versión anterior de MATLAB no tiene la función XJitter. Actualmente estoy ocupado y no tendré tiempo para desarrollar funciones similares en un futuro cercano. Por lo tanto, antes de tener tiempo para desarrollar funciones relacionadas , intente utilizar una versión más reciente. ! ! ! ! ! ! ! ~
sección de tutoriales
0 preparación de datos
Aquí se generan algunos datos al azar, y he extraído los cinco colores del artículo. Tomemos los dos primeros colores esta vez:
figure('Units','normalized','Position',[.2,.3,.36,.45],'Color','w');
rng(24)
% 随机生成了两组数据
DataA = rand(7,1)*ones(1,5).*2+rand(7,5)./3.5;
DataB = rand(7,1)*ones(1,5)./2+rand(7,5)./3.5;
meanData = [mean(DataA,2), mean(DataB,2)];
% 文章图片中的颜色数据
CList = [188,188,240; 160,161,166; 237,187,128;
177,202,233; 245,185,192]./255;
CList = CList([1,2],:);
% CList = CList([4,5],:);
% 横坐标标签文本
NameList = {
'Cortex';
'Hippocampus';
'Cerebellum';
'Brainstem';
'Cervical spinal cord';
'Thoracic spinal cord';
'Lumbar spinal cord'};
1 dibujo básico
histograma
hold on
% 绘制柱状图 ---------------------------------------------------------------
barHdl = bar(meanData,'EdgeColor','none','FaceAlpha',.5,'BarWidth',.7);
% 修改配色
barHdl(1).FaceColor = CList(1,:);
barHdl(2).FaceColor = CList(2,:);
Gráfico de dispersión
% 绘制散点图 ---------------------------------------------------------------
XA = barHdl(1).XEndPoints.'*ones(1,size(DataA,2));
scatter(XA(:),DataA(:),55,'filled','o','MarkerEdgeColor','k','LineWidth',.8,...
'CData',CList(1,:),'XJitter','rand','XJitterWidth',0.15)
XB = barHdl(2).XEndPoints.'*ones(1,size(DataB,2));
scatter(XB(:),DataB(:),55,'filled','o','MarkerEdgeColor','k','LineWidth',.8,...
'CData',CList(2,:),'XJitter','rand','XJitterWidth',0.15)
barras de error
La desviación estándar utilizada directamente aquí:
% 绘制误差棒 ---------------------------------------------------------------
errorbar(barHdl(1).XEndPoints,meanData(:,1),std(DataA,0,2),'vertical',...
'LineStyle','none','LineWidth',1,'Color','k')
errorbar(barHdl(2).XEndPoints,meanData(:,2),std(DataB,0,2),'vertical',...
'LineStyle','none','LineWidth',1,'Color','k')
3 Modificación simple del área de coordenadas
Lo principal es ajustar la fuente y modificar la etiqueta de escala del eje X:
% 绘制误差棒 ---------------------------------------------------------------
errorbar(barHdl(1).XEndPoints,meanData(:,1),std(DataA,0,2),'vertical',...
'LineStyle','none','LineWidth',1,'Color','k')
errorbar(barHdl(2).XEndPoints,meanData(:,2),std(DataB,0,2),'vertical',...
'LineStyle','none','LineWidth',1,'Color','k')
4 ejes truncados
Aquí se usa una función que escribí antes. Para evitar problemas para que todos la encuentren, se coloca en el almacén de gitee al final del artículo y al final del artículo.
Lo siguiente se logra llamando a la función del eje de truncamiento al final del texto:
% 截断坐标轴
truncAxis('y',[1,1.4]);
Refinamiento de 5 ejes
Incluyendo ocultar la línea de base, agregar etiquetas en el eje Y, modificar el grosor del eje de coordenadas y la dirección de la escala, etc.:
fig = gcf;
ax1 = fig.Children(1);
ax2 = fig.Children(2);
% 隐藏基线
ax1.XColor = 'none';
ax1.Children(end).BaseLine.Color = 'none';
% 坐标轴修饰
ax1.LineWidth = 1.5;
ax2.LineWidth = 1.5;
ax1.TickDir = 'out';
ax2.TickDir = 'out';
% 增添Y轴标签
ax1.YLabel.String = 'ug of Ab/ g wet weight of tissue';
ax1.YLabel.Position = [0 1.4 -1];
ax1.YLabel.FontSize = 15;
6 Añadir una marca distintiva
Simplemente agregue una columna por columna y cambie el número de serie y el carácter para obtener un efecto más acorde con el deseado:
% 随便加点显著性标志
N = 2; % 第二个柱
S = '***';
% 要修改右侧柱请改成barHdl(2)及DataB(N,:)
X = barHdl(1).XEndPoints(N);
Y = max(DataA(N,:))+.1;
errorbar(X,Y,.2,'horizontal','LineStyle','none','LineWidth',1,'Color','k')
text(X,Y,S,'FontSize',15,'FontWeight','bold','FontName','Arial',...
'HorizontalAlignment','center','VerticalAlignment','baseline')
N = 3; % 第三个柱
S = '****';
% 要修改右侧柱请改成barHdl(2)及DataB(N,:)
X = barHdl(1).XEndPoints(N);
Y = max(DataA(N,:))+.1;
errorbar(X,Y,.2,'horizontal','LineStyle','none','LineWidth',1,'Color','k')
text(X,Y,S,'FontSize',15,'FontWeight','bold','FontName','Arial',...
'HorizontalAlignment','center','VerticalAlignment','baseline')
N = 6; % 第六个柱
S = '****';
% 要修改右侧柱请改成barHdl(2)及DataB(N,:)
X = barHdl(1).XEndPoints(N);
Y = max(DataA(N,:))+.1;
errorbar(X,Y,.2,'horizontal','LineStyle','none','LineWidth',1,'Color','k')
text(X,Y,S,'FontSize',15,'FontWeight','bold','FontName','Arial',...
'HorizontalAlignment','center','VerticalAlignment','baseline')
más pantalla a color
código completo
Tutorial código completo
% code for pnas.2200057120fig03
% by slandarer
% bar chart with trunc-axis
figure('Units','normalized','Position',[.2,.3,.36,.45],'Color','w');
rng(24)
% 随机生成了两组数据
DataA = rand(7,1)*ones(1,5).*2+rand(7,5)./3.5;
DataB = rand(7,1)*ones(1,5)./2+rand(7,5)./3.5;
meanData = [mean(DataA,2), mean(DataB,2)];
% 文章图片中的颜色数据
CList = [188,188,240; 160,161,166; 237,187,128;
177,202,233; 245,185,192]./255;
CList = CList([1,2],:);
% CList = CList([4,5],:);
% 横坐标标签文本
NameList = {
'Cortex';
'Hippocampus';
'Cerebellum';
'Brainstem';
'Cervical spinal cord';
'Thoracic spinal cord';
'Lumbar spinal cord'};
hold on
% 绘制柱状图 ---------------------------------------------------------------
barHdl = bar(meanData,'EdgeColor','none','FaceAlpha',.5,'BarWidth',.7);
% 修改配色
barHdl(1).FaceColor = CList(1,:);
barHdl(2).FaceColor = CList(2,:);
% 绘制散点图 ---------------------------------------------------------------
XA = barHdl(1).XEndPoints.'*ones(1,size(DataA,2));
scatter(XA(:),DataA(:),55,'filled','o','MarkerEdgeColor','k','LineWidth',.8,...
'CData',CList(1,:),'XJitter','rand','XJitterWidth',0.15)
XB = barHdl(2).XEndPoints.'*ones(1,size(DataB,2));
scatter(XB(:),DataB(:),55,'filled','o','MarkerEdgeColor','k','LineWidth',.8,...
'CData',CList(2,:),'XJitter','rand','XJitterWidth',0.15)
% 绘制误差棒 ---------------------------------------------------------------
errorbar(barHdl(1).XEndPoints,meanData(:,1),std(DataA,0,2),'vertical',...
'LineStyle','none','LineWidth',1,'Color','k')
errorbar(barHdl(2).XEndPoints,meanData(:,2),std(DataB,0,2),'vertical',...
'LineStyle','none','LineWidth',1,'Color','k')
% 坐标区域简单修饰
ax = gca;
ax.XTick = 1:length(barHdl(1).XEndPoints);
ax.XTickLabel = NameList(:);
ax.FontName = 'Arial';
ax.FontWeight = 'bold';
ax.FontSize = 11;
ax.XTickLabelRotation = 35;
% 截断坐标轴
truncAxis('y',[1,1.4]);
fig = gcf;
ax1 = fig.Children(1);
ax2 = fig.Children(2);
% 隐藏基线
ax1.XColor = 'none';
ax1.Children(end).BaseLine.Color = 'none';
% 坐标轴修饰
ax1.LineWidth = 1.5;
ax2.LineWidth = 1.5;
ax1.TickDir = 'out';
ax2.TickDir = 'out';
% 增添Y轴标签
ax1.YLabel.String = 'ug of Ab/ g wet weight of tissue';
ax1.YLabel.Position = [0 1.4 -1];
ax1.YLabel.FontSize = 15;
% -------------------------------------------------------------------------
% 随便加点显著性标志
N = 2; % 第二个柱
S = '***';
% 要修改右侧柱请改成barHdl(2)及DataB(N,:)
X = barHdl(1).XEndPoints(N);
Y = max(DataA(N,:))+.1;
errorbar(X,Y,.2,'horizontal','LineStyle','none','LineWidth',1,'Color','k')
text(X,Y,S,'FontSize',15,'FontWeight','bold','FontName','Arial',...
'HorizontalAlignment','center','VerticalAlignment','baseline')
N = 3; % 第三个柱
S = '****';
% 要修改右侧柱请改成barHdl(2)及DataB(N,:)
X = barHdl(1).XEndPoints(N);
Y = max(DataA(N,:))+.1;
errorbar(X,Y,.2,'horizontal','LineStyle','none','LineWidth',1,'Color','k')
text(X,Y,S,'FontSize',15,'FontWeight','bold','FontName','Arial',...
'HorizontalAlignment','center','VerticalAlignment','baseline')
N = 6; % 第六个柱
S = '****';
% 要修改右侧柱请改成barHdl(2)及DataB(N,:)
X = barHdl(1).XEndPoints(N);
Y = max(DataA(N,:))+.1;
errorbar(X,Y,.2,'horizontal','LineStyle','none','LineWidth',1,'Color','k')
text(X,Y,S,'FontSize',15,'FontWeight','bold','FontName','Arial',...
'HorizontalAlignment','center','VerticalAlignment','baseline')
El código completo de la función de herramienta de eje truncado
function truncAxis(varargin)
% @author : slandarer
% gzh : slandarer随笔
% 获取参数
if isa(varargin{
1},'matlab.graphics.axis.Axes')
ax=varargin{
1};varargin(1)=[];
else
ax=gca;
end
hold(ax,'on');
% box(ax,'off')
ax.XAxisLocation='bottom';
ax.YAxisLocation='left';
axisPos=ax.Position;
axisXLim=ax.XLim;
axisYLim=ax.YLim;
axisXScale=diff(axisXLim);
axisYScale=diff(axisYLim);
truncRatio=1/20;
Xtrunc=[];Ytrunc=[];
for i=1:length(varargin)-1
switch true
case strcmpi('X',varargin{
i}),Xtrunc=varargin{
i+1};
case strcmpi('Y',varargin{
i}),Ytrunc=varargin{
i+1};
end
end
switch true
case isempty(Xtrunc)
% 复制坐标区域
ax2=copyAxes(ax);
% 修改轴基础属性
ax2.XTickLabels=[];
ax2.XColor='none';
% 修改坐标区域范围
ax.YLim=[axisYLim(1),Ytrunc(1)];
ax2.YLim=[Ytrunc(2),axisYLim(2)];
% 坐标区域重定位
ax.Position(4)=axisPos(4)*(1-truncRatio)/(axisYScale-diff(Ytrunc))*(Ytrunc(1)-axisYLim(1));
ax2.Position(2)=axisPos(2)+ax.Position(4)+axisPos(4)*truncRatio;
ax2.Position(4)=axisPos(4)*(1-truncRatio)/(axisYScale-diff(Ytrunc))*(axisYLim(2)-Ytrunc(2));
% 链接轴范围变动
linkaxes([ax,ax2],'x')
% 添加线和标识符
if strcmp(ax.Box,'on')
ax.Box='off';ax2.Box='off';
annotation('line',[1,1].*(ax.Position(1)+ax.Position(3)),[ax.Position(2),ax.Position(2)+ax.Position(4)],'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[1,1].*(ax.Position(1)+ax.Position(3)),[ax2.Position(2),ax2.Position(2)+ax2.Position(4)],'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[ax.Position(1),ax.Position(1)+ax.Position(3)],[1,1].*(ax2.Position(2)+ax2.Position(4)),'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
else
annotation('line',[ax.Position(1),ax.Position(1)+ax.Position(3)],[1,1].*(ax.Position(2)+ax.Position(4)),'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[ax.Position(1),ax.Position(1)+ax.Position(3)],[1,1].*(ax2.Position(2)),'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
end
createSlash([ax.Position(1)-.2,ax.Position(2)+ax.Position(4)-.2,.4,.4])
createSlash([ax.Position(1)-.2,ax2.Position(2)-.2,.4,.4])
createSlash([ax.Position(1)+ax.Position(3)-.2,ax.Position(2)+ax.Position(4)-.2,.4,.4])
createSlash([ax.Position(1)+ax.Position(3)-.2,ax2.Position(2)-.2,.4,.4])
case isempty(Ytrunc)
% 复制坐标区域
ax2=copyAxes(ax);
% 修改轴基础属性
ax2.YTickLabels=[];
ax2.YColor='none';
% 修改坐标区域范围
ax.XLim=[axisXLim(1),Xtrunc(1)];
ax2.XLim=[Xtrunc(2),axisXLim(2)];
% 坐标区域重定位
ax.Position(3)=axisPos(3)*(1-truncRatio)/(axisXScale-diff(Xtrunc))*(Xtrunc(1)-axisXLim(1));
ax2.Position(1)=axisPos(1)+ax.Position(3)+axisPos(3)*truncRatio;
ax2.Position(3)=axisPos(3)*(1-truncRatio)/(axisXScale-diff(Xtrunc))*(axisXLim(2)-Xtrunc(2));
% 链接轴范围变动
linkaxes([ax,ax2],'y')
% 添加线和标识符
if strcmp(ax.Box,'on')
ax.Box='off';ax2.Box='off';
annotation('line',[ax.Position(1),ax.Position(1)+ax.Position(3)],[1,1].*(ax.Position(2)+ax.Position(4)),'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[ax2.Position(1),ax2.Position(1)+ax2.Position(3)],[1,1].*(ax.Position(2)+ax.Position(4)),'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[1,1].*(ax2.Position(1)+ax2.Position(3)),[ax2.Position(2),ax2.Position(2)+ax2.Position(4)],'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
else
annotation('line',[1,1].*(ax.Position(1)+ax.Position(3)),[ax2.Position(2),ax2.Position(2)+ax2.Position(4)],'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[1,1].*(ax2.Position(1)),[ax2.Position(2),ax2.Position(2)+ax2.Position(4)],'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
end
createSlash([ax.Position(1)+ax.Position(3)-.2,ax.Position(2)-.2,.4,.4])
createSlash([ax2.Position(1)-.2,ax.Position(2)-.2,.4,.4])
createSlash([ax.Position(1)+ax.Position(3)-.2,ax.Position(2)+ax.Position(4)-.2,.4,.4])
createSlash([ax2.Position(1)-.2,ax.Position(2)+ax.Position(4)-.2,.4,.4])
case (~isempty(Ytrunc))&(~isempty(Ytrunc))
% 复制坐标区域
ax2=copyAxes(ax);
ax3=copyAxes(ax);
ax4=copyAxes(ax);
% 修改轴基础属性
ax2.XTickLabels=[];
ax2.XColor='none';
ax3.XTickLabels=[];
ax3.XColor='none';
ax3.YTickLabels=[];
ax3.YColor='none';
ax4.YTickLabels=[];
ax4.YColor='none';
% 修改坐标区域范围
ax.YLim=[axisYLim(1),Ytrunc(1)];
ax.XLim=[axisXLim(1),Xtrunc(1)];
ax2.XLim=[axisXLim(1),Xtrunc(1)];
ax2.YLim=[Ytrunc(2),axisYLim(2)];
ax3.XLim=[Xtrunc(2),axisXLim(2)];
ax3.YLim=[Ytrunc(2),axisYLim(2)];
ax4.XLim=[Xtrunc(2),axisXLim(2)];
ax4.YLim=[axisYLim(1),Ytrunc(1)];
% 坐标区域重定位
ax.Position(3)=axisPos(3)*(1-truncRatio)/(axisXScale-diff(Xtrunc))*(Xtrunc(1)-axisXLim(1));
ax.Position(4)=axisPos(4)*(1-truncRatio)/(axisYScale-diff(Ytrunc))*(Ytrunc(1)-axisYLim(1));
ax2.Position(2)=axisPos(2)+ax.Position(4)+axisPos(4)*truncRatio;
ax2.Position(3)=axisPos(3)*(1-truncRatio)/(axisXScale-diff(Xtrunc))*(Xtrunc(1)-axisXLim(1));
ax2.Position(4)=axisPos(4)*(1-truncRatio)/(axisYScale-diff(Ytrunc))*(axisYLim(2)-Ytrunc(2));
ax3.Position(1)=axisPos(1)+ax.Position(3)+axisPos(3)*truncRatio;
ax3.Position(2)=axisPos(2)+ax.Position(4)+axisPos(4)*truncRatio;
ax3.Position(3)=axisPos(3)*(1-truncRatio)/(axisXScale-diff(Xtrunc))*(axisXLim(2)-Xtrunc(2));
ax3.Position(4)=axisPos(4)*(1-truncRatio)/(axisYScale-diff(Ytrunc))*(axisYLim(2)-Ytrunc(2));
ax4.Position(1)=axisPos(1)+ax.Position(3)+axisPos(3)*truncRatio;
ax4.Position(3)=axisPos(3)*(1-truncRatio)/(axisXScale-diff(Xtrunc))*(axisXLim(2)-Xtrunc(2));
ax4.Position(4)=axisPos(4)*(1-truncRatio)/(axisYScale-diff(Ytrunc))*(Ytrunc(1)-axisYLim(1));
% 链接轴范围变动
linkaxes([ax3,ax2],'y')
linkaxes([ax4,ax3],'x')
linkaxes([ax,ax2],'x')
linkaxes([ax,ax4],'y')
% 添加线和标识符
if strcmp(ax.Box,'on')
ax.Box='off';ax2.Box='off';ax3.Box='off';ax4.Box='off';
annotation('line',[ax.Position(1),ax.Position(1)+ax.Position(3)],[1,1].*(ax2.Position(2)+ax2.Position(4)),'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[ax3.Position(1),ax3.Position(1)+ax3.Position(3)],[1,1].*(ax2.Position(2)+ax2.Position(4)),'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[1,1].*(ax4.Position(1)+ax4.Position(3)),[ax3.Position(2),ax3.Position(2)+ax3.Position(4)],'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[1,1].*(ax4.Position(1)+ax4.Position(3)),[ax4.Position(2),ax4.Position(2)+ax4.Position(4)],'LineStyle','-','LineWidth',ax.LineWidth,'Color',ax.XColor);
else
annotation('line',[1,1].*(ax.Position(1)+ax.Position(3)),[ax2.Position(2),ax2.Position(2)+ax2.Position(4)],'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[1,1].*(ax3.Position(1)),[ax2.Position(2),ax2.Position(2)+ax2.Position(4)],'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[1,1].*(ax.Position(1)+ax.Position(3)),[ax.Position(2),ax.Position(2)+ax.Position(4)],'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[1,1].*(ax3.Position(1)),[ax.Position(2),ax.Position(2)+ax.Position(4)],'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[ax.Position(1),ax.Position(1)+ax.Position(3)],[1,1].*(ax.Position(2)+ax.Position(4)),'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[ax.Position(1),ax.Position(1)+ax.Position(3)],[1,1].*(ax2.Position(2)),'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[ax4.Position(1),ax4.Position(1)+ax4.Position(3)],[1,1].*(ax.Position(2)+ax.Position(4)),'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
annotation('line',[ax4.Position(1),ax4.Position(1)+ax4.Position(3)],[1,1].*(ax2.Position(2)),'LineStyle',':','LineWidth',ax.LineWidth,'Color',ax.XColor);
end
createSlash([ax.Position(1)-.2,ax.Position(2)+ax.Position(4)-.2,.4,.4])
createSlash([ax.Position(1)-.2,ax2.Position(2)-.2,.4,.4])
createSlash([ax4.Position(1)+ax4.Position(3)-.2,ax.Position(2)+ax.Position(4)-.2,.4,.4])
createSlash([ax4.Position(1)+ax4.Position(3)-.2,ax2.Position(2)-.2,.4,.4])
createSlash([ax.Position(1)+ax.Position(3)-.2,ax.Position(2)-.2,.4,.4])
createSlash([ax.Position(1)+ax.Position(3)-.2,ax2.Position(2)+ax2.Position(4)-.2,.4,.4])
createSlash([ax4.Position(1)-.2,ax.Position(2)-.2,.4,.4])
createSlash([ax4.Position(1)-.2,ax2.Position(2)+ax2.Position(4)-.2,.4,.4])
% 修改当前坐标区域,方便legend添加
set(gcf,'currentAxes',ax3)
end
% 复制原坐标区域全部可复制属性
function newAX=copyAxes(ax)
axStruct=get(ax);
fNames=fieldnames(axStruct);
newAX=axes('Parent',ax.Parent);
coeList={
'CurrentPoint','XAxis','YAxis','ZAxis','BeingDeleted',...
'TightInset','NextSeriesIndex','Children','Type','Legend'};
for n=1:length(coeList)
coePos=strcmp(fNames,coeList{
n});
fNames(coePos)=[];
end
for n=1:length(fNames)
newAX.(fNames{
n})=ax.(fNames{
n});
end
copyobj(ax.Children,newAX)
end
% 添加截断标识符函数
function createSlash(pos)
anno=annotation('textbox');
anno.String='/';
anno.LineStyle='none';
anno.FontSize=15;
anno.Position=pos;
anno.FitBoxToText='on';
anno.VerticalAlignment='middle';
anno.HorizontalAlignment='center';
end
end
encima
Lo anterior es todo el contenido de este artículo. Si eres demasiado perezoso para copiar el código, puedes ir al siguiente almacén de gitee para obtener todo el código: