小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Matlab數(shù)據(jù)可視化(2):基礎篇 II

 lynchlynch12 2013-11-15

五. 添加圖例

(源代碼legends.m)
在圖像包含較多圖形時,適當?shù)膱D例對快速、正確的理解圖像反映的信息是必不可少的。以下一個實例可以說明精心設計圖例的重要性。
我們在一幅圖像中,同時繪出10個不同均值和方差的正態(tài)分布曲線。數(shù)據(jù)可以由如下代碼生成,或直接加載10NormalDistributions.mat
  1. % stdVect and meanVect  
  2. stdVect = [.49,.26,.93,.47,.25,.43,.7,.4,.18,.86];  
  3. meanVect = [-.8,-.62,-.44,-.27,-.09,.09,.27,.44,.62,.8];  
  4.   
  5. % 正態(tài)分布數(shù)據(jù),每行一個  
  6. t = -1:.02:1;  
  7. dataVect = ones(10,length(t));  
  8. for i=1:10  
  9.     dataVect(i,:) = (1/sqrt(2*pi)/stdVect(i))*...  
  10.         exp(-(t-meanVect(i)).^2/(2*stdVect(i)^2));       
  11. end  
  12.   
  13. % 圖例說明  
  14. legendMatrix = cell(1,10);  
  15. for i = 1:10      
  16.     legendMatrix{i} = [sprintf( 'mean = %.2f, std = %.2f',...  
  17.         meanVect(i),stdVect(i) )];  
  18. end  
  19. legend(legendMatrix);  
  20.   
  21. save('10NormalDistribution.mat', 'stdVect','meanVect',...  
  22.     'dataVect','legendMatrix');  
  23.   
  24. clear;  
1、首先,我們不加額外處理的使用圖例。(圖1)顯然,這幅圖的可讀性非常差,我們很難將參數(shù)和圖形對應起來,有的曲線顏色甚至還相同!
  1. % 加載數(shù)據(jù) meanVect stdVect legendMatrix  
  2. load 10NormalDistributions;  
  3.   
  4. % 繪圖  
  5. plot(dataVect');  
  6. xlim([0,100]);  
  7.   
  8. % 添加標注  
  9. title({'10種不同的正態(tài)分布','圖例不缺乏清晰度','顏色區(qū)分也不明顯!'},'Color',[1 0 0]);  
  10. xlabel('x');  
  11. ylabel('x的概率密度函數(shù)');  
圖1
2、我們通過改變曲線的顏色(color)、線型(line style)和標志(marker)的方式增加可讀性,并將圖例放置在圖像外邊。(圖2)
  1. % 為不同曲線生成不同的設置  
  2. LineStyles = {'-','--',':'};  
  3. MarkerSpecs = {'+','o'};  
  4. ColorSpecs = {'r','g','b','k'};  
  5. cnt = 1;  
  6. for i = 1:length(LineStyles)  
  7.     for j = 1:length(MarkerSpecs)  
  8.         for k = 1:length(ColorSpecs)  
  9.             LineSpecs{cnt} = [LineStyles{i} MarkerSpecs{j} ...  
  10.                 ColorSpecs{k}];  
  11.             cnt = cnt+1;  
  12.         end  
  13.     end  
  14. end  
  15.   
  16. figure; hold on;  
  17. for i = 1:10      
  18.     plot(dataVect(i,:), LineSpecs{i});      
  19. end  
  20. xlim([0 100]);  
  21.   
  22. title({'10種不同的正態(tài)分布','使用不同的顏色和線型','可讀性大大提高'});  
  23. xlabel('x'); ylabel('x的概率密度函數(shù)');  
  24. legend(legendMatrix,'Location','NorthEastOutside',...  
  25.     'Fontsize',8);  
  26. box on;  

圖2

3、 有時候,我們可能會將圖形分組。由于每執(zhí)行一次繪圖任務,legend的計數(shù)就會增加1,因此,在這種情況下,我們可以通過如下方式來減少圖例數(shù)量。(圖3)
  1. % 合并圖例  
  2. figure; hold;  
  3. h1 = plot(dataVect(1:6,:)','rd-','Color',[1 0 0]);  
  4. h2 = plot(dataVect(7:10,:)','k*--','Color',[0 0 0]);  
  5. xlim([0 100]);  
  6.   
  7. h = legend([h1(1),h2(1)],['Color 1' char(10) 'first 6 curves'],...  
  8.     ['Color 2' char(10) 'remaining 4 curves'],...  
  9.     'Location','Best');  
  10.   
  11. % 提高可讀性,將圖例字體顏色調整為與圖形顏色一致  
  12. % 注意:每兩個為一組,分別代表直線、標號和文字的顏色的屬性,且順序與所表示的圖形順序相反,即第一個繪制的圖形的圖例出現(xiàn)在數(shù)組的最后3個  
  13. c = get(h,'Children');  
  14. set(c(1:3),'Color',[0,0,0]);  
  15. set(c(4:6),'Color',[1,0,0]);  
圖3
4、利用legendlex優(yōu)化圖例。(圖4)
legendfex為我們提供了更加靈活的調整圖例格式的功能。得用legendflex, 我們不但可以調整說明的布局(指定分幾行或幾列顯示),還可以單獨調整圖標和文字的大小,設定圖例相對于任何對象的位置(原始legend限于坐標軸)。利用 legendflex ,我們還可以為圖例添加小標題。legendflex可從之里下載
  1. figure('units','normalized','position',...  
  2.     [ 0.4172 0.1769 0.3 0.5]);  
  3. hold on;  
  4. for i = 1:10  
  5.     h(i) = plot(dataVect(i,:), LineSpecs{i});  
  6. end  
  7. xlim([0 100]);  
  8. legendflex(h,... %handle to plot lines  
  9.     legendMatrix,... %corresponding legend entries  
  10.     'ref', gcf, ... %which figure  
  11.     'anchor', {'nw','nw'}, ... %location of legend box  
  12.     'buffer',[30 -5], ... %an offset wrt the location  
  13.     'nrow',4, ... %number of rows  
  14.     'fontsize',8,... %font size  
  15.     'xscale',.5); %a scale factor for actual symbols  
  16.   
  17. title({'應用legendflex優(yōu)化圖像顯示','可以調整相對位置、布局,字體及圖標大小'});  
  18. xlabel('x'); ylabel('x的概率密度函數(shù)');  



圖4

六. 通過數(shù)據(jù)變換突出細節(jié)特征

(源代碼trans.m)
有些數(shù)據(jù)通過一定的變換后,更便于可視化,也更容易發(fā)現(xiàn)隱藏的信息。
1、繪制一幅雙Y軸圖(圖5)
  1. %% 生成數(shù)據(jù)  
  2. x = 1:50;  
  3. r = 5e5;  
  4. E = [ones(1,30) linspace(1,0,15) zeros(1,5)];  
  5. y1 = r * (1+E).^x;  
  6.   
  7. %% 繪制又Y軸圖形  
  8. y2 = log(y1);  
  9. axes('position',[0.1300    0.1100    0.7750    0.7805]);  
  10.   
  11. [AX,H1,H2] = plotyy(x,y1,x,y2,'plot');  
  12. title({'利用對數(shù)變換增強數(shù)據(jù)','增長、穩(wěn)定、衰減的可視化效果'});  
  13. set(get(AX(1),'Ylabel'),'String','data');  
  14. set(get(AX(2),'Ylabel'),'String','log(data)');  
  15. xlabel('x'); set(H1,'LineStyle','--'); set(H2,'LineStyle',':');  
  16.   
  17. %% 添加標注  
  18. annotation('textarrow',[.26 .28],[.67,.37],'String',['指數(shù)增長' char(10) '(1到30周期)']);  
  19. annotation('textarrow',[.7 .7],[.8,.64],'String',['非指數(shù)衰減' char(10) '(30到45周期)']);  
  20. annotation('textarrow',[.809 .859],[.669,.192],'String',['穩(wěn)定' char(10) '(45到50周期)']);  
  21. legend({'原始數(shù)據(jù)','對數(shù)變換后的數(shù)據(jù)'},'Location','Best');  
  22. set(gcf,'Paperpositionmode','auto','Color',[1 1 1]);  
圖5
2、在數(shù)字較大時,matlab會默認采用科學計數(shù)法,有時這可能不是我們想要的,我們可以通過如下方式處理。(圖6)
  1. %% 關閉科學記數(shù)法格式  
  2. % 改變圖像大小  
  3. set(gcf,'units','normalized','position',[0.0411    0.5157    0.7510    0.3889]);  
  4. % AX(1) 存儲的是原始數(shù)據(jù)的句柄  
  5. title({'利用對數(shù)變換增強數(shù)據(jù)','增長、穩(wěn)定、衰減的可視化效果','關閉科學計數(shù)法格式'});  
  6. n=get(AX(1),'Ytick');  
  7. set(AX(1),'yticklabel',sprintf('%d |',n'));  



圖6

3、通過縮放坐標軸達到變換的目的
上邊實例中,我們通過對原始數(shù)據(jù)進行取對數(shù)操作達到變換的效果。由于對數(shù)操作的常用性,Matlab允許我們直接對X和Y軸進行對數(shù)縮放。semilogx、semilogy、loglog可以分別對X軸、Y軸和XY軸進行對數(shù)縮放。這也可以通過設置坐標軸的xscale和yscale屬性實現(xiàn)。
  1. %% 直接利用 semilogx, semilogy, loglog  
  2. figure;  
  3. subplot(2,1,1);  
  4. semilogy(x,y1);  
  5. xlabel('x');   
  6. ylabel('取對數(shù)后數(shù)據(jù)');  
  7. title({'MATLAB的semilogy函數(shù)',...  
  8.                '直接將Y軸對數(shù)縮放后顯示'});  
  9. subplot(2,1,2);  
  10. plot(x,y1);   
  11. set(gca,'yscale','log');  
  12. xlabel('x');   
  13. ylabel('取對數(shù)后的數(shù)據(jù)');  
  14. title({'使用常規(guī)的plot進行繪圖','然后通過理性屬性達到相同目的'});  

圖7

七. 多圖的繪制

(源代碼subfig.m)
1、常規(guī)子圖的繪制
我們利用蘋果公司2011年度每日股票交易數(shù)據(jù)為例,繪制包括開盤價、最高價、最低價、收盤價、成交量和臨近收盤價在內的6個趨勢圖。

首先加載數(shù)據(jù)
  1. %% 加載數(shù)據(jù)并按時間先后順序排列  
  2. [AAPL dateAAPL] = xlsread('AAPL_090784_012412.csv');  
  3. dateAAPL = datenum({dateAAPL{2:end,1}});  
  4. dateAAPL = dateAAPL(end:-1:1);  
  5. AAPL = AAPL(end:-1:1,:);  
  6. % 選擇時間窗口(2011年全年)  
  7. rangeMIN = datenum('1/1/2011');  
  8. rangeMAX = datenum('12/31/2011');  
  9. idx = find(dateAAPL >= rangeMIN & dateAAPL <= rangeMAX);  
然后,通過subplot命令繪圖(圖8)
  1. %% 使用subplot繪圖命令繪制常規(guī)子圖網格  
  2. % 注意設置各個子圖的標題內容的title命令的位置   
  3.   
  4. figure('units','normalized','position',[ 0.0609    0.0593    0.5844    0.8463]);  
  5. matNames = {'開盤價','最高價','最低價','收盤價','成交量','臨近收盤價'};  
  6. for i = 1:6  
  7.     subplot(3,2,i);   
  8.     plot(idx,AAPL(idx,i));  
  9.     if i~=5  
  10.         title([matNames{i} ' $, subplot(3,2,' num2str(i) ')'],'Fontsize',12,'Color',[1 0 0 ]);      
  11.         ylabel('美元');  
  12.     else  
  13.         title([matNames{i} ' vol, subplot(3,2,' num2str(i) ')'],'Fontsize',12,'Color',[1 0 0 ]);  
  14.         ylabel('成交量');  
  15.     end  
  16.     set(gca,'xtick',linspace(idx(1),idx(end),12),'xticklabel',...  
  17.         datestr(linspace(dateAAPL(idx(1)),dateAAPL(idx(end)),12),...  
  18.                                                 'mm'),'Fontsize',10,'fontweight','bold');  
  19.     rotateXLabels(gca,40);  
  20.     box on; axis tight  
  21. end  
  22. % 添加總標題  
  23. annotation('textbox',[ 0.37   0.96   0.48   0.03],'String','2011年度蘋果公司股價趨勢','Fontsize',14,'Linestyle','none');  
圖8
2、進階篇
我們可以自定義子圖的布局,并且子圖可以是任何一種圖形。下面我們繪制包括3個垂直排列的子圖(由上而下編號1、2、3)的圖像(如圖9)。子圖1展示選定時間窗口內的股價走勢,子圖2展示相同時期內的成交量,子圖3則顯示全部時間內股價的變化情況。

圖9
子圖1是一個面積圖,可通過area命令繪制。
  1. %% 自定義子圖布局  
  2. figure('units','normalized','Position',[ 0.0427    0.2102    0.6026    0.6944]);  
  3.   
  4. %% 子圖1顯示收盤價隨時間的變化趨勢  
  5. % 設置坐標軸位置  
  6. Panel1 = axes('Position',[ 0.0570    0.5520    0.8850    0.3730]);hold;   
  7. % 繪制面積圖   
  8. area(AAPL(idx,4),'FaceColor',[188 210 238]/255,'edgecolor',[54 100 139 ]/255);   
  9. % 設置坐標軸相關參數(shù)  
  10. xlim([1 length(idx)]);   
  11. yminv = min(AAPL(idx,4))-.5*range(AAPL(idx,4));  
  12. ymaxv = max(AAPL(idx,4))+.1*range(AAPL(idx,4));  
  13. ylim([yminv ymaxv]);  
  14. box on;  
  15. % 繪制網格線  
  16. set(gca,'Ticklength',[0 0],'YAxisLocation','right');  
  17. line([linspace(1,length(idx),15);linspace(1,length(idx),15)],[yminv*ones(1,15); ymaxv*ones(1,15)],'Color',[.9 .9 .9]);  
  18. line([ones(1,10); length(idx)*ones(1,10)],[linspace(yminv, ymaxv,10); linspace(yminv, ymaxv,10);],'Color',[.9 .9 .9]);  
  19. % 設置注解  
  20. set(gca,'xtick',linspace(1,length(idx),10),'xticklabel',datestr(linspace(dateAAPL(idx(1)),dateAAPL(idx(end)),10),'ddmmmyy'));  
  21. title({'蘋果公司股票價格,','(選定時間窗口內細節(jié)展示)'},'Fontsize',12);  
子圖2是一個條形圖,可通過bar命令繪制。
  1. %% 子圖2展示相同時間段內成交量的變化情況  
  2. % 設置坐標軸位置  
  3. Panel2 = axes('Position',[ 0.0570 0.2947  0.8850  0.1880]);  
  4. % 用條形圖繪圖  
  5. bar(1:length(idx), AAPL(idx,5),.25,...  
  6.                      'FaceColor',[54 100 139 ]/255);   
  7. hold; xlim([1 length(idx)]);hold on;  
  8. % 添加網格線  
  9. yminv = 0;  
  10. ymaxv = round(max(AAPL(idx,5)));  
  11. line([linspace(1,length(idx),30);...  
  12.       linspace(1,length(idx),30)],...  
  13.      [yminv*ones(1,30); ymaxv*ones(1,30)],...  
  14.                             'Color',[.9 .9 .9]);  
  15. line([ones(1,5); length(idx)*ones(1,5)],...  
  16.      [linspace(yminv, ymaxv,5); ...  
  17.       linspace(yminv, ymaxv,5);],'Color',[.9 .9 .9]);  
  18. ylim([yminv ymaxv]);  
  19. % 設置特殊的時間刻度  
  20. set(gca, 'Ticklength',[0 0],...  
  21. 'xtick',linspace(1,length(idx),10),'xticklabel',...  
  22.   datestr(linspace(dateAAPL(idx(1)),dateAAPL(idx(end)),10),...  
  23.                                                 'ddmmmyy'));  
  24. tickpos = get(Panel2,'ytick')/1000000;  
  25. for i = 1:numel(tickpos)  
  26.     C{i} = [num2str(tickpos(i)) 'M'];   
  27. end  
  28. set(Panel2,'yticklabel',C,'YAxisLocation','right');  
  29. text(0,1.15*ymaxv,'成交量','VerticalAlignment','top',...  
  30.         'Color',[54 100 139 ]/255,'Fontweight','bold');  

子圖3是也一個面積圖,其中選定時間段被高亮,這是通過在大圖上疊加繪制一個與子圖1相同顏色的小得到。
  1. %% 子圖3展示全部時間段內股價變化情況,其中被選中的時間窗口高亮顯示  
  2. Panel3 = axes('Position',[0.0570    0.1100    0.8850    0.1273]);  
  3. area(dateAAPL, AAPL(:,4),'FaceColor',[234 234 234 ]/255,'edgecolor',[.8 .8 .8]); hold;   
  4. line([min(idx) min(idx)],get(gca,'ylim'),'Color','k');  
  5. line([max(idx) max(idx)],get(gca,'ylim'),'Color','k');  
  6. set(gca,'Ticklength',[0 0]);  
  7. % 相同顏色重新繪制時間窗口內的趨勢  
  8. area(dateAAPL(idx),AAPL(idx,4),'FaceColor',[188 210 238]/255,'edgecolor',[54 100 139 ]/255);   
  9. ylim([min(AAPL(:,4)) 1.1*max(AAPL(:,4))]);  
  10. xlabel('長期股價走勢');  
  11. line([min(get(gca,'xlim')) min(get(gca,'xlim'))],get(gca,'ylim'),'Color',[1 1 1]);  
  12. line([max(get(gca,'xlim')) max(get(gca,'xlim'))],get(gca,'ylim'),'Color',[1 1 1]);  
  13. line(get(gca,'xlim'),[max(get(gca,'ylim')) max(get(gca,'ylim'))],'Color',[1 1 1]);  
  14. line(get(gca,'xlim'),[min(get(gca,'ylim')) min(get(gca,'ylim'))],'Color',[1 1 1]);  
  15. set(gca,'xticklabel',datestr(get(gca,'xtick'),'yyyy'),'yticklabel',[]);  

八. 可視化直觀地比較實驗結果

(源代碼comparison.m)
這涉及多種方法的對比實驗中,選擇適當?shù)姆绞竭M行可視化分析,有助于我們快速、直觀地對各種方法的優(yōu)劣進行評判。我們以五種聚類算法在5個測試集上的實驗結果為數(shù)據(jù),通過繪圖對其進行比較。
我們已經知道,matlab自帶有多種配色方案(colormap)可供選擇,我們還可以自定義配色方案。為了保證配色的友好性和易區(qū)分性,我們可以通過在線工具color brewer(http:///),對配色進行測試,輔助我們找到比較好的方案。

圖10
  1. %% 定義可視化方案   
  2. % 設定圖像大小和位置  
  3. figure('units','normalized','Position',[ 0.0880    0.1028    0.6000    0.6352]);  
  4.   
  5. % 繪制一個隱藏的坐標軸,其X軸刻度標簽列出進行比較的五種算法的名稱  
  6. hh = axes('Position',[.1,.135,.8,.1]);  
  7. set(gca,'Visible','Off','TickLength',[0.0 0.0],'TickDir','out','YTickLabel','','xlim',[0 nosOfMethods],'FontSize',11,'FontWeight','bold');  
  8. set(gca,'XTick',.5:nosOfMethods-.5,'XTickLabel',{'K Means','Fuzzy C Means','Hierarchical','Maximize Expectation','Dendogram'});  
  9. catgeoryLabels = {'Fresh Tissue','FFPE','Blood','DNA','Simulated'};  
  10. rotateXLabels(gca,20);  
  11. % 將Y軸長等分為五份,分別分配給5個測試集結果  
  12. y = linspace(.142,.75,nosOfCategories);  
  13.   
  14. % Place an axes for creating each row dedicated to a sample   
  15. % category. The height of the axes corresponds to the total   
  16. % number of samples in that category.  
  17. %    
  18. for i = 1 :nosOfCategories  
  19.       
  20.     if CategoryTotals(i); ylimup = CategoryTotals(i); else ylimup = 1; end  
  21.     dat = [MethodPerformanceNumbers(i,:)];  
  22.     h(i) = axes('Position',[.1,y(i),.8,y(2)-y(1)]);  
  23.     set(gca,'XTickLabel','','TickLength',[0.0 0.0],'TickDir','out','YTickLabel','','xlim',[.5 nosOfMethods+.5],'ylim',[0 ylimup]);  
  24.   
  25.     % Use the line command to create bars representing the number of successes   
  26.     % in each category using colour scheme defined at the beginning of this recipe  
  27.     line([1:nosOfMethods; 1:nosOfMethods],[zeros(1,nosOfMethods); dat],'Color',Colors(i,:),'Linewidth',7);box on;  
  28.       
  29.     % Place the actual number as a text next to the bar  
  30.     for j= 1:nosOfMethods  
  31.         if dat(j); text(j+.01,dat(j)-.3*dat(j),num2str(dat(j)),'Rotation',20,'FontSize',13); end  
  32.     end  
  33.       
  34.     % Add the category label  
  35.     ylabel([catgeoryLabels{i} char(10) '#Samples' char(10) ' = ' num2str(ylimup) ],'Fontsize',11);   
  36. end  
  37. % Add annotations  
  38. title('5種聚類算法成功的次數(shù)','Fontsize',14,'Fontweight','bold');  
  39. axes(h(3));  
  40. text(-0.02,-80,'聚類算法在不同數(shù)據(jù)集上的表現(xiàn)','rotation',90,'Fontsize',14,'Fontweight','bold');  


    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多