欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Matlab如何繪制?;鶊D

 更新時間:2022年03月02日 11:45:57   作者:slandarer  
桑基圖是一種特定類型的流程圖,圖中延伸的分支的寬度對應數(shù)據(jù)流量的大小,通常應用于能源、材料成分、金融等數(shù)據(jù)的可視化分析。本文將用Matlab繪制好看的?;鶊D,需要的可以參考一下

這次主要是分享自己寫的一個函數(shù),用來繪制?;鶊D,效果大概是下面這樣子:

先說明函數(shù)(sankey2)怎么用,函數(shù)完整代碼放在博客最后

詳細用法

1 使用示例

新建一個m文件,運行如下代碼

List={'a1',1,'A';
      'a2',1,'A';
      'a3',1,'A';
      'a3',0.5,'C';
      'b1',1,'B';
      'b2',1,'B';
      'b3',1,'B';
      'c1',1,'C';
      'c2',1,'C';
      'c3',1,'C';
      'A',2,'AA';
      'A',1,'BB';
      'B',1.5,'BB';
      'B',1.5,'AA';
      'C',3.5,'BB';
      };
axis([0,2,0,1])
sankeyHdl=sankey2([],'XLim',[0,2],'YLim',[0,1],'PieceWidth',0.15,'List',List,'Color',[0.3,0.3,0.7])

2 輸入?yún)?shù)

2.1 必要輸入?yún)?shù)

必要參數(shù)一共有四個,第一個就是流量表(‘List’),可以從excel里導入,也可以像下圖這樣直接寫在cell數(shù)組里:

List={'a1',1,'A';
      'a2',1,'A';
      'a3',1,'A';
      'a3',0.5,'C';
      'b1',1,'B';
      'b2',1,'B';
      'b3',1,'B';
      'c1',1,'C';
      'c2',1,'C';
      'c3',1,'C';
      'A',2,'AA';
      'A',1,'BB';
      'B',1.5,'BB';
      'B',1.5,'AA';
      'C',3.5,'BB';
      };

另外三個參數(shù)為,x軸范圍(‘xLim’),y軸范圍(‘YLim’),以及函數(shù)第一個參數(shù),要繪制圖像的axes,要畫在當前窗口可以將第一個參數(shù)寫作[]或者gca

2.2 修飾參數(shù)

主要有以下幾個,不寫時用省缺值替換

  • Color 方塊顏色
  • EdgeColor 方塊邊緣顏色
  • FontSize 字號
  • FontColor 字體顏色
  • PieceWidth 方塊寬度
  • Margin ?;鶊D距離邊緣距離
  • Sep 縱向空白占方塊總長度比例

其中Color可以是個nx3大小的矩陣,矩陣中數(shù)值范圍為[0,1],例如:

List={'a1',1,'A';
      'a2',1,'A';
      'a3',1,'A';
      'a3',0.5,'C';
      'b1',1,'B';
      'b2',1,'B';
      'b3',1,'B';
      'c1',1,'C';
      'c2',1,'C';
      'c3',1,'C';
      'A',2,'AA';
      'A',1,'BB';
      'B',1.5,'BB';
      'B',1.5,'AA';
      'C',3.5,'BB';
      };
axis([0,2,0,1])
colorList=[0.4600    0.5400    0.4600
    0.5400    0.6800    0.4600
    0.4100    0.4900    0.3600
    0.3800    0.5300    0.8400
    0.4400    0.5900    0.8700
    0.5800    0.7900    0.9300
    0.6500    0.6400    0.8400
    0.6300    0.6300    0.8000
    0.5600    0.5300    0.6700
    0.7600    0.8100    0.4300
    0.5600    0.8600    0.9700
    0.7800    0.5900    0.6500
    0.8900    0.9100    0.5300
    0.9300    0.5600    0.2500];
sankeyHdl=sankey2([],'XLim',[0,2],'YLim',[0,1],'PieceWidth',0.15,'List',List,'Color',colorList)

3 輸出

函數(shù)的輸出如下:

nameList就是每一個元素的名稱,block是每一個方塊的圖形對象,connect是每一個連接的圖形對象,txt是每一個標簽的文本對象,我們可以做出以下操作:

圖形對象和文本對象原本自帶的屬性依舊可以用(顏色,位置,透明度,邊緣粗細等等)
假設我們編寫了如下代碼的基礎上,我們嘗試對對象進行操作:

List={'a1',1,'A';
      'a2',1,'A';
      'a3',1,'A';
      'a3',0.5,'C';
      'b1',1,'B';
      'b2',1,'B';
      'b3',1,'B';
      'c1',1,'C';
      'c2',1,'C';
      'c3',1,'C';
      'A',2,'AA';
      'A',1,'BB';
      'B',1.5,'BB';
      'B',1.5,'AA';
      'C',3.5,'BB';
      };
axis([0,2,0,1])
sankeyHdl=sankey2([],'XLim',[0,2],'YLim',[0,1],'PieceWidth',0.15,'List',List,'Color',colorList)

操作1 把第四個方塊顏色變?yōu)榧t色

sankeyHdl.block(4).FaceColor=[0.8,0.3,0.3];

操作2 把第10個方塊的第一個連接變?yōu)榧t色

sankeyHdl.connect(10,1).FaceColor=[0.8,0.3,0.3];

操作3 把第11個標簽文本放大

sankeyHdl.txt(11).FontSize=40;

函數(shù)完整代碼

function sankeyHdl=sankey2(varargin)
if strcmp(get(varargin{1},'type'),'axes' )
    ax=varargin{1};
else
    ax=gca;
end
hold(ax,'on')

%若未設置,則圖像的初始值==================================================
prop.Color=[0,0,0];
prop.FontSize=10;
prop.FontColor=[0,0,0];
prop.Xlim=[0,1];
prop.YLim=[0,1];
prop.PieceWidth=0.15;
prop.List=[];
prop.Margin=0.05;
prop.Sep=1/8;
prop.EdgeColor=[0 0 0];

%從可變長度變量中提取有用信息==============================================
for i=1:length(varargin)
    tempVar=varargin{i};
    if ischar(tempVar)&&length(tempVar)>1
        prop.(tempVar)=varargin{i+1};
    end
end

%流量矩陣構建==============================================================
nameList=unique([prop.List(:,1);prop.List(:,3)],'stable');
blockMat=zeros(length(nameList));
for i=1:size(prop.List,1)
    s=strcmp(nameList,prop.List(i,1));
    e=strcmp(nameList,prop.List(i,3));
    blockMat(s,e)=prop.List{i,2};
end
totalFlow=max([sum(blockMat,1);sum(blockMat,2)'],[],1);


%劃分?;鶊D層次============================================================
List_L=prop.List(:,1);
List_R=prop.List(:,3);
prop.layer=[];layerRoot=[];n=1;
for i=length(List_R):-1:1
    if ~any(strcmp(List_L,List_R{i}))
        layerRoot=[layerRoot;find(strcmp(nameList,List_R{i}))];
    end
end
layerRoot=unique(layerRoot,'stable');
while ~isempty(List_L)
    layer_n=[];
    for i=length(List_L):-1:1
        if ~any(strcmp(List_R,List_L{i}))
            layer_n=[layer_n;find(strcmp(nameList,List_L{i}))];
            List_L(i)=[];
            List_R(i)=[];
        end
    end
    layer_n=unique(layer_n,'stable');
    prop.layer(length(layer_n),n)=0;
    prop.layer(1:length(layer_n),n)=layer_n;
    n=n+1;
end
prop.layer(length(layerRoot),n)=0;
prop.layer(1:length(layerRoot),n)=layerRoot;
prop.layerNum=size(prop.layer,2);




%繪制方塊==================================================================
baseBlockX=[0,1,1,0];
baseBlockY=[0,0,1,1];
bnul=max(sum(prop.layer~=0,1));   %block number upper limit
baseLenY=(diff(prop.YLim)-2*prop.Margin)/(bnul+(bnul-1)*prop.Sep)*bnul;
baseLenX=(diff(prop.XLim)-2*prop.Margin)/(prop.layerNum-0.5);
colorIndex=1;
for i=1:prop.layerNum
    tempY=prop.Margin;
    elemSet=prop.layer(prop.layer(:,i)~=0,i);
    flowSet=totalFlow(elemSet);
    offSet=(diff(prop.YLim)-2*prop.Margin-baseLenY/length(elemSet)*((length(elemSet)+(length(elemSet)-1)*prop.Sep)))/2;
    for j=1:length(elemSet)
        tempLenY=baseLenY./sum(flowSet).*flowSet(j);
        
        sankeyHdl.block(prop.layer(j,i))=...
        fill(baseBlockX.*prop.PieceWidth+prop.Margin+(i-1)*baseLenX,...
            baseBlockY.*tempLenY+tempY+offSet,...
            prop.Color(colorIndex,:),'EdgeColor',prop.EdgeColor);
        
        tempY=tempY+tempLenY+baseLenY/length(elemSet)*prop.Sep;
        colorIndex=mod(colorIndex,size(prop.Color,1))+1;
    end
end

%繪制連接
layerList=prop.layer(:);
for i=1:length(nameList)
    for j=i:length(nameList)
        if blockMat(i,j)~=0
            Hdl_L=sankeyHdl.block(i);
            Hdl_R=sankeyHdl.block(j);
            list_L=find(blockMat(i,:)~=0);
            list_R=find(blockMat(:,j)~=0);
            [~,pl,~]=intersect(layerList,list_L(:));
            [~,pr,~]=intersect(layerList,list_R(:));
            list_L=layerList(sort(pl));
            list_R=layerList(sort(pr));
            flow_L=blockMat(i,list_L);
            flow_R=blockMat(list_R,j);
            XData_L=Hdl_L.XData;YData_L=Hdl_L.YData;
            XData_R=Hdl_R.XData;YData_R=Hdl_R.YData;
            xx=[XData_L(1:2);XData_R(1:2)]';
            k_L=find(list_L==j);
            k_R=find(list_R==i);
            yy=[YData_L(1:2)+(YData_L(3:4)-YData_L(1:2))./sum(flow_L).*sum(flow_L(1:k_L-1));
                YData_R(1:2)+(YData_R(3:4)-YData_R(1:2))./sum(flow_R).*sum(flow_R(1:k_R-1))]';
            xxq=XData_L(2):0.01:XData_R(1);
            yyq=interp1(xx,yy,xxq,'pchip');
            tempColor=Hdl_L.FaceColor;
            width=(YData_R(3)-YData_R(1))./sum(flow_R).*flow_R(k_R);
             sankeyHdl.connect(i,k_L)=...
            fill([xxq,xxq(end:-1:1)],[yyq,yyq(end:-1:1)+width],tempColor,'EdgeColor','none','FaceAlpha',0.3);
        end    
    end
end

%繪制文本
for i=1:prop.layerNum
    tempY=prop.Margin;
    elemSet=prop.layer(prop.layer(:,i)~=0,i);
    flowSet=totalFlow(elemSet);
    offSet=(diff(prop.YLim)-2*prop.Margin-baseLenY/length(elemSet)*((length(elemSet)+(length(elemSet)-1)*prop.Sep)))/2;
    for j=1:length(elemSet)
        tempLenY=baseLenY./sum(flowSet).*flowSet(j);
        
        sankeyHdl.txt(prop.layer(j,i))=...
        text(prop.PieceWidth+prop.Margin+(i-1)*baseLenX,tempLenY/2+tempY+offSet,[' ',nameList{elemSet(j)}],...
            'FontSize',prop.FontSize,'Color',prop.FontColor);
        
        tempY=tempY+tempLenY+baseLenY/length(elemSet)*prop.Sep;
    end
end
sankeyHdl.nameList=nameList';
end

使用示例代碼

List={'零食',300,'食品開銷';
      '飲料',150,'食品開銷';
      '水果',250,'食品開銷';
      '食堂',600,'食品開銷';
      '外賣',400,'食品開銷';
      '水費',90,'住宿開銷';
      '電費',90,'住宿開銷';
      '網(wǎng)費',120,'住宿開銷';
      '食品開銷',1700,'開銷';
      '住宿開銷',300,'開銷'};
axis([0,2,0,1])
sankeyHdl=sankey2([],'XLim',[0,2],'YLim',[0,1],'PieceWidth',0.15,'List',List,'Color',colorList)

sankeyHdl.block(4).FaceColor=[0.8,0.3,0.3];
sankeyHdl.txt(4).FontSize=40;

試試證明還是方塊畫細一點顯得高級,修飾一下:

以上就是詳解Matlab如何繪制?;鶊D的詳細內容,更多關于Matlab?;鶊D的資料請關注腳本之家其它相關文章!

相關文章

  • C++和OpenCV實現(xiàn)圖像字符化效果

    C++和OpenCV實現(xiàn)圖像字符化效果

    圖像字符化的意思是將圖像以字符形式呈現(xiàn),具有一定的娛樂價值,許多開發(fā)人員通過python實現(xiàn)該功能,C++實現(xiàn)的代碼較少,因此本文通過C++和OpenCV實現(xiàn),給予C++開發(fā)人員一些可供借鑒的思路,需要的朋友可以參考下
    2022-06-06
  • 在C++中如何阻止類被繼承詳解

    在C++中如何阻止類被繼承詳解

    這篇文章主要介紹了在C++中如何阻止類被繼承,對于C++初學者而言可以通過本文實例更好的理解類的原理及運用,需要的朋友可以參考下
    2021-09-09
  • C語言實現(xiàn)折半查找法(二分法)

    C語言實現(xiàn)折半查找法(二分法)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)折半查找法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • VisualStudio2019構建C/C++靜態(tài)庫和動態(tài)庫dll的問題 附源碼

    VisualStudio2019構建C/C++靜態(tài)庫和動態(tài)庫dll的問題 附源碼

    這篇文章主要介紹了VisualStudio2019構建C/C++靜態(tài)庫和動態(tài)庫(dll)(文末附源碼),本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • C語言字符串與字符數(shù)組面試題中最易錯考點詳解

    C語言字符串與字符數(shù)組面試題中最易錯考點詳解

    這篇文章主要介紹了C語言字符串與字符數(shù)組面試題中最易錯考點,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • 使用C++17實現(xiàn)JSON庫設計思路示例全解

    使用C++17實現(xiàn)JSON庫設計思路示例全解

    這篇文章主要為大家介紹了使用C++17實現(xiàn)JSON庫設計思路示例全解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Objective-C 消息傳遞機制詳解

    Objective-C 消息傳遞機制詳解

    Objective-C語言中方法的傳遞有二種:①Selector ② Blocks,本文主要說一下Selector,本文以Objective-C 消息傳遞機制進行詳細介紹,關于Blocks會在后續(xù)總結一下
    2012-11-11
  • C語言數(shù)據(jù)結構算法基礎之循環(huán)隊列示例

    C語言數(shù)據(jù)結構算法基礎之循環(huán)隊列示例

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結構算法基礎之循環(huán)隊列,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法

    OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法

    這篇文章主要為大家詳細介紹了OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 一文詳解C++關鍵詞auto的用法

    一文詳解C++關鍵詞auto的用法

    在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它,在 C++11中,auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,本文將給大家詳細的介紹一下C++關鍵詞auto的用法,需要的朋友可以參考下
    2024-02-02

最新評論