MATLAB | 绘图复刻(十一) | 截断的含散点及误差棒的分组柱状图

hey大家好久不见,本期带来一篇绘图复刻,居然已经出到第11篇了,不知道有朝一日有没有机会破百,本期绘制的是《PNAS》期刊中pnas.2200057120文章的figure03,文章题目为Intranasal delivery of full-length anti-Nogo-A antibody: A potential alternative route for therapeutic antibodies to central nervous system targets可在以下网址下载该文章pdf原文:

  • https://www.pnas.org/doi/epdf/10.1073/pnas.2200057120

本期要复刻的绘图长这样:

本人复刻的效果长这样:

虽然还是有些许不同但是大部分元素已经还原出来了,以下为教程部分:

请尽量使用新版本的MATLAB,比较旧版本的MATLAB无XJitter功能,本人目前较忙近期不会有空开发类似功能,因此在我未有空开发相关功能前,请尽量使用比较新的版本!!!!!!!!~


教程部分

0 数据准备

这里随便随机生成了一点数据,文章中的五个颜色都被我提取了出来,我们这次先取用前两个颜色:

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 基础绘图

柱状图

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')


3 坐标区域简单修饰

主要是调整字体,并修改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 截断坐标轴

这里用的我之前写的一个函数,为了怕大家找起来麻烦,放在了文末及文末的gitee仓库里。

以下是调用文末截断坐标轴函数实现的:

% 截断坐标轴
truncAxis('y',[1,1.4]);


5 坐标轴精修

包括隐藏baseline,添加Y轴标签,修改坐标轴粗细及刻度方向等:

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 添加显著性标注

就一个柱子一个柱子加吧,改改序号和字符就能得到比较符合想法的效果:

% 随便加点显著性标志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')


更多颜色展示


完整代码

教程完整代码

% code for pnas.2200057120fig03
% by slandarer
% bar chart with trunc-axisfigure('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')

截断坐标轴工具函数完整代码

function truncAxis(varargin)
% @author : slandarer
% gzh  : slandarer随笔% 获取参数
if isa(varargin{1},'matlab.graphics.axis.Axes')ax=varargin{1};varargin(1)=[];
elseax=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)-1switch truecase strcmpi('X',varargin{i}),Xtrunc=varargin{i+1};case strcmpi('Y',varargin{i}),Ytrunc=varargin{i+1};end
end
switch truecase 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);elseannotation('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);endcreateSlash([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);elseannotation('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);endcreateSlash([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);elseannotation('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);endcreateSlash([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)=[];endfor n=1:length(fNames)newAX.(fNames{n})=ax.(fNames{n});endcopyobj(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

以上已经是本文全部内容,若懒得复制代码,可以去以下gitee仓库获取全部代码:

https://gitee.com/slandarer/PLTreprint/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/85759.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库新闻速递 -- POSTGRESQL 正在蚕食数据库市场 (翻译)

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加 liuaustin3微信号 ,在新加的朋友会分到3群&#xff…

HTML详解连载(1)

HTML详解连载(1) HTML定义HTML 超文本标记语言标签语法注意拓展 HTML基本骨架解释VS Code 快速生成骨架:标签的关系父子关系(嵌套关系)兄弟关系(并列关系) 代码格式注释 标题标签标签名:h1-h6(双…

分布式数据库视角下的存储过程

存储过程很好呀,那些用不好的人就是自己水平烂,不接受反驳!我就有过这样念头,但分布式数据库,更倾向少用或不用存储过程。 1 我从C/S时代走来 C/S架构时代的末期最流行开发套件是PowerBuilder和Sybase数据库&#xf…

unity vscode 代码关联 跳转 BUG

一早打开电脑发现代码关联失效了,目测可能跟昨天一些插件更新有关 结论 就这货,开了就没法提示代码关联,估计预览版全是BUG。 另一个坑 同期有个unity插件也是预览版,“非常好使”,当场去世。评论点开有好几个人说用…

【C++面向对象】--- 继承 的奥秘(上篇)

个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长&…

第三篇|金融人数据来源有哪些

数据对于金融行业真的很重要,那么金融人有哪些途径查数据呢? 国内: 1. 国家统计局 这个应该是无论什么行业都使用最频繁的网站,每个月都会固定发上个月资产投资数据 、工业增加值和利润数据等常规数据,其他数据也会…

半关闭、端口复用与IO多路复用

文章目录 半关闭端口复用IO多路复用(IO多路转接)模型解决措施 sellect缺点 poll应用缺点 epoll应用工作模式 半关闭 使用close(fd);所对应的文件描述符写和读都关闭了。 端口复用 可以解决绑定失败的问题。 IO多路复用(IO多路转接&#…

【二分+贪心】CF1665 C

Problem - C - Codeforces 题意: 思路: 一开始想太简单wa6了 只想到先感染大的分量,然后最后把最大的分量剩下的染色 但是可能会有别的分量更大(因为最后给最大的染色之后可能不再是最大的) 可以用堆维护&#xf…

加载并绘制时间域内的心电图信号,并实施Q因子为1的陷波滤波器以去除50 Hz频率研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Cadvisor+InfluxDB+Grafan+Prometheus(详解)

目录 一、CadvisorInfluxDBGrafan案例概述 (一)Cadvisor Cadvisor 产品特点: (二)InfluxDB InfluxDB应用场景: InfluxDB主要功能: InfluxDB主要特点: (三&#…

SpringBoot案例-部门管理-删除

目录 查看页面原型,明确需求 页面原型 需求 阅读接口文档 思路分析 功能接口开发 控制层(Controllre类) 业务层(Service类) 持久层(Mapper类) 接口测试 前后端联调 查看页面原型&a…

AWS-自定义ami的S3存取使用

需要提前配置好aws-cli哈 对应的区域 要统一 示例:即AWS-CLI 和 EC2、AMI、S3以上资源均要使用同已区域,以下拿新加坡举例 1.新建自定义AMI 2.查看ami状态 确认是可用状态,才能开始操作 3.aws-cli 开始存入s3 只能使用桶的根目录 开始上…

Python-OpenCV中的图像处理-直方图

Python-OpenCV中的图像处理-直方图 直方图统计直方图绘制直方图Matplotlib绘制灰度直方图Matplotlib绘制RGB直方图 使用掩膜统计直方图直方图均衡化Numpy图像直方图均衡化OpenCV中的直方图均衡化CLAHE 有限对比适应性直方图均衡化 2D直方图OpenCV中的2D直方图Numpy中2D直方图 直…

Glide 的超时控制相关处理

作者:newki 前言 Glide 相信大家都不陌生,各种源码分析,使用介绍大家应该都是烂熟于心。但是设置 Glide 的超时问题大家遇到过没有。 我遇到了,并且掉坑里了,情况是这样的。 调用接口从网络拉取用户头像&#xff0c…

在外SSH远程连接Ubuntu系统

在外SSH远程连接Ubuntu系统【无公网IP】 文章目录 在外SSH远程连接Ubuntu系统【无公网IP】前言1. 在Ubuntu系统下安装cpolar软件2. 完成安装后打开cpolar客户端web—UI界面3. 创建隧道取得连接Ubuntu系统公网地址4. 打开Windows的命令界面并输入命令 前言 随着科技和经济的发展…

解锁Python集合的妙用:常用函数与实例深度解析

Python的集合(Set)是一种无序且不重复的数据结构,拥有强大的去重和集合运算功能。在这篇博客中,我们将深入探讨集合的常用函数,并通过实际案例为你展示其灵活应用。 创建集合​ 集合可以通过花括号来创建&#xff0c…

golang拥有wireshark数据包解析能力

golang拥有wireshark数据包解析能力 1. 功能和实现 wireshark拥有世界上最全面的协议解析能力并且还在不断更新中,通过调研,没有办法找到与wireshark同水平的解析工具。 为了使得golang语言可以拥有wireshark一样强大的协议解析能力,库 gowir…

生态系统服务(InVEST模型)

第一天: 1. 生态系统服务理论联系实践案例讲解 2. InVEST模型的开发历程、不同版本的差异及对数据需求的讲解 3. InVEST所需数据的要求(分辨率、格式、投影系统等)、获取及标准化预处理讲解 4. InVEST运行常见问题及处理解决方法讲解 5.…

微信小程序实现当前页面更新上一个页面

日常项目中需要实现的一个价格脱敏功能:通过点击页面二中的查看完整信息 点击回退按钮实现页面一中的价格显露出来 通过查询了大量资料发现 大多数都是通过调用上一个接口的onload 或者onshow 实现视图更新 经测试后 发现 无法实现 只能更改数据 无法更新视图 实现…

解决:django设置DEBUG=false时出现的问题

首先,我用的是django4.2,python3.10版本 本来,如果在settings.py中使用 DEBUG True,那么什么问题也没有,当然,这属于调试模式。 DEBUG True TEMPLATE_DEBUG DEBUGSTATIC_URL /static/ STATICFILES_DI…