MATLAB | Como desenhar um gráfico de dispersão tão traçado?

parte.-1 Prefácio

Estou um pouco ocupado recentemente, talvez o conteúdo atualizado seja relativamente simples, desculpe, uau, o conteúdo atualizado de hoje:


part.0 Prefácio

Vendo o gzh BYtools科研笔记(recomendo a todos dar uma olhada, existem muitos gráficos interessantes reproduzidos na linguagem R!!) fiz uma imagem assim:

Parece muito interessante, mas o autor usou a linguagem R + Adobe Illustrator para completá-lo, então eu queria ver se poderia usar o MATLAB para completá-lo. A figura é do jornal:

  • Li, Pu-Dong & Zhu, Zeng-Rong & Zhang, Yunzeng & Xu, Jianping & Wang, Hongkai & Wang, Zhengyi & Li, Hongye. (2022). O microbioma da filosfera muda para combater o patógeno da melanose. Microbiome. 10. 10.1186 /s40168-022-01234-x.

Figura A da Figura 6:

Para baixar um artigo, você pode abri-lo copiando o link abaixo em seu navegador:

  • https://www.researchgate.net/journal/Microbiome-2049-2618/publication/359692392_The_phyllosphere_microbiome_shifts_toward_combating_melanose_pathogen/links/6248fec18068956f3c6532fa/The-phyllosphere-microbiome-shifts-toward-combating-melanose-path ogen.pdf

Obviamente, o armazém Gitee fornecido no final do meu artigo também fornece um arquivo pdf, que pode ser baixado e visualizado.


parte.1 função principal

É desenhar scatteros pontos de dispersão duas vezes com a função, uma com arestas, e outra para deletar as arestas, e ao mesmo tempo definir um dos plots para não aparecer na legenda. É apenas uma pequena função de três ou cinco linhas de código, que podem criar um novo arquivo m (arquivo Matlab) ou apenas colocá-lo no final do código.

function stHdl = strokeScatter(varargin)
    set(gca,'NextPlot','add');
    scHdl = scatter(varargin{
    
    :});
    stHdl = scatter(varargin{
    
    :},'MarkerEdgeColor','none');
    scHdl.Annotation.LegendInformation.IconDisplayStyle='off';
end

parte.2 Uso e reprodução

uso básico

O uso de dados (consulte o armazém Gitee no final do artigo para os dados usados) faz loops e desenhos diretamente é muito semelhante:

% BinningDemo
Date  = readtable('binningData.txt','Delimiter',',');
% Group = flipud(unique(Date.group))
Group = {
    
    'other bins'; 'bin 19'; 'bin 13'; 'bin 11'; 'bin 3'; 'bin 5'};
CList = [177,177,176; 63,168,106; 24,222,154;
         96,0,123; 189,83,110; 170,219,87]./255;

figure('Units','normalized','Position',[.2,.3,.4,.6]);
% 循环绘制散点
for i = 1:length(Group)
    ind  = strcmp(Date.group,Group(i));
    binX = Date.X(ind);
    binY = Date.Y(ind);
    if i == 1
        strokeScatter(binX,binY,170,'filled','CData',CList(i,:),...
            'MarkerEdgeColor','none');
    else
        strokeScatter(binX,binY,170,'filled','CData',CList(i,:),...
            'MarkerEdgeColor','k','LineWidth',2);
    end
end

Modificação da área de coordenadas

% 坐标区域修饰
ax = gca;
ax.PlotBoxAspectRatio = [1,1,1];
ax.Box = 'on';
ax.LineWidth = 2;
ax.FontName = 'Times New Roman';
ax.XGrid = 'on';
ax.YGrid = 'on';
ax.TickDir = 'out';
ax.XLim = [0.2,0.85];
ax.YTick = 0:50:150;
ax.XTick = 0.4:0.2:0.8;
ax.FontSize = 14;
ax.XColor = [.2,.2,.2];
ax.YColor = [.2,.2,.2];
% X轴副标签
ax.XRuler.SecondaryLabel.String = 'GC content';
ax.XRuler.SecondaryLabel.Position(1) = ax.XLim(1);
ax.XRuler.SecondaryLabel.HorizontalAlignment = 'left';
ax.XRuler.SecondaryLabel.FontSize = 16;
ax.XRuler.SecondaryLabel.VerticalAlignment = 'bottom';
ax.XRuler.SecondaryLabel.FontWeight = 'bold';
% Y轴标签
ax.YLabel.String = 'Contig abundance';
ax.YLabel.FontSize = 24;
ax.YLabel.FontWeight = 'bold';

adicionar legenda

% 绘制图例
lgdHdl = legend(Group);
lgdHdl.NumColumns = length(Group);
lgdHdl.Location = 'southoutside';
lgdHdl.Box = 'off';
lgdHdl.FontSize = 14;


part.3 Outros exemplos

Acabei de escrever um código aqui, com preguiça de pensar em como gerar um monte de dados, então simplesmente deixei as coordenadas X serem arredondadas ao mesmo tempo, para que os pontos fossem reunidos:

clc; clear; close all
rng(6)
% 生成随机点(Generate random points)
mu = [1 1; 12 10; 9 12];
S  = cat(3,[1 0; 0 2],[1 0; 0 2],[1 0; 0 1]);
r1 = abs(mvnrnd(mu(1,:),S(:,:,1),200));
r2 = abs(mvnrnd(mu(2,:),S(:,:,2),200));
r3 = abs(mvnrnd(mu(3,:),S(:,:,3),200));
% 绘制散点图(Draw scatter chart)
hold on
propCell = {
    
    'LineWidth',2,'MarkerEdgeColor',[.3,.3,.3],'SizeData',100};
strokeScatter(round(r1(:,1)),r1(:,2),'filled','CData',[0.40 0.76 0.60],propCell{
    
    :});
strokeScatter(round(r2(:,1)),r2(:,2),'filled','CData',[0.99 0.55 0.38],propCell{
    
    :});
strokeScatter(round(r3(:,1)),r3(:,2),'filled','CData',[0.55 0.63 0.80],propCell{
    
    :});
% 增添图例(Draw legend)
lgd = legend('class1','class2','class3');
lgd.Location = 'northwest';
lgd.FontSize = 14;
% 坐标区域基础修饰(Axes basic decoration)
ax=gca; grid on
ax.FontName   = 'Cambria';
ax.Color      = [0.9,0.9,0.9];
ax.Box        = 'off';
ax.TickDir    = 'out';
ax.GridColor  = [1 1 1];
ax.GridAlpha  = 1;
ax.LineWidth  = 1;
ax.XColor     = [0.2,0.2,0.2];
ax.YColor     = [0.2,0.2,0.2];
ax.TickLength = [0.015 0.025];
% 隐藏轴线(Hide XY-Ruler)
pause(1e-6)
ax.XRuler.Axle.LineStyle = 'none';
ax.YRuler.Axle.LineStyle = 'none';


function stHdl = strokeScatter(varargin)
    set(gca,'NextPlot','add');
    scHdl = scatter(varargin{
    
    :});
    stHdl = scatter(varargin{
    
    :},'MarkerEdgeColor','none');
    scHdl.Annotation.LegendInformation.IconDisplayStyle='off';
end


sobre

Recomende gzh novamente BYtools科研笔记, embora a conta pareça não ter sido criada há muito tempo, mas há muito conteúdo de alta qualidade!

Todos os códigos e documentos originais deste artigo estão disponíveis nos seguintes armazéns da Gitee:

https://gitee.com/slandarer/spdraw

Acho que você gosta

Origin blog.csdn.net/slandarer/article/details/132013578
Recomendado
Clasificación