2014年8月11日 星期一

[Matlab/Octave] 泡泡圖 (Bubble plot)

在許多的情況下,我們可以使用泡泡圖作為資訊的表達方式。在大熟知的 Microsoft Office Excel中也有泡泡圖的選項可供大家使用。Microsoft Office Excel 所提供的泡泡圖功能並不完善。這邊以 Matlab 進行數據的處理,並繪製泡泡圖。

數據特性:
有三個比較組別,每組都有相同的績分等級。
在此,欲比較組別間的積分分布情況。

例題:
三隻小馬比賽搶四種水果,搶到的結果如下圖。











Matlab 程式碼:
%輸入組別數據 
group=[0 8 16 5;20 6 0 0;5 5 5 5];  %分別輸入三隻小馬的結果,以分號做組別區隔 
%數據百分比轉換
sum1=sum(group(1,:)); %對大馬的數據進行加總
sum2=sum(group(2,:)); %對中馬的數據進行加總
sum3=sum(group(3,:)); %對小馬的數據進行加總
group(1,:)=(group(1,:)./sum1).^0.5; %對大馬的數據百分比化,並開根已達面積比目的。若欲使泡泡大小為半徑比則更改為group(1,:)=group(1,:)./sum1。 
group(2,:)=(group(2,:)./sum2).^0.5; %中馬,同上
group(3,:)=(group(3,:)./sum3).^0.5; %小馬,同上
clear sum1 sum2 sum3; %清除已經不再使用的變數
%畫圖
set(figure,'color','white') %呼叫出繪圖窗,並設定底色為白色
hold; %由於泡泡是一個一個畫上去的,因此繪圖過程中必須把握住
g=3; %代表組別
for i=1:g %依照組別進行繪圖
    for j=1:4 %代表四種不同水果
        if group(i,j)>0 %由於偏食的大馬及中馬沒有搶到四種水果,必須篩選掉數值為0的部分
            plot(i,j,'.','Markersize',group(i,j)*150,'color',[1-i/g 1-i/g 1-i/g]) %'.'代表實心點,可更改為空心圓:'o',Markersize為設定點大小的屬性,group中的數值已經處理過,再乘上常數150(更改此常數不影響比例關係),color為設定點的色彩屬性,[]中有三組數據代表RGB,數值區間為0-1,此設定使組間有不同程度的灰色。
        end
    end
end
%繪圖區設定 
xlim([0.5 3.5]); %設定x軸的兩端
ylim([0.5 4.5]);
set(gca,'xticklabel',[],'xtick',[1:1:3],'yticklabel',[],'ytick',[1:1:4]) %刪除xy標籤及設定刻度
xxposi=[1 2 3]; %設定x軸標籤的x值
xyposi=0.3*ones(1,3); %設定x軸標籤的y值
yxposi=0.4*ones(1,4); %設定y軸標籤的x值
yyposi=[1:1:4]; %設定y軸標籤的y值
text(xxposi,xyposi,{'大馬','中馬','小馬'},'HorizontalAlignment','center','FontSize', 14); %HorizontalAlignment 為對齊方式,有左中右三種。
text(yxposi,yyposi,{'榴槤','香蕉','木瓜','蘋果'},'HorizontalAlignment','right','FontSize', 14); 

繪圖結果:






















屬性更動:
若要繪製彩色可以更改color屬性
plot(i,j,'.','Markersize',group(i,j)*150,'color',[i/g 1-i/g 1-i/g])
這樣就可以得到彩色版的圖了,如下(不適合黑白影印)



























此數據處理用於看出組內百分比例的情況,並非所有組綜合後的百分比例。
這種作圖法較少見,但表示法清楚明瞭,可以善加運用。

1 則留言:

  1. Octave執行時必須多修正gca position ,文字標籤才不會切到。完整程式碼更改如下。
    ---------------------------------------------------------------------------------------------------
    group=[0 8 16 5;20 6 0 0;5 5 5 5];
    sum1=sum(group(1,:));
    sum2=sum(group(2,:));
    sum3=sum(group(3,:));
    group(1,:)=(group(1,:)./sum1).^0.5;
    group(2,:)=(group(2,:)./sum2).^0.5;
    group(3,:)=(group(3,:)./sum3).^0.5;
    clear sum1 sum2 sum3;

    set(figure,'color','white')
    hold;
    g=3;
    for i=1:g
    for j=1:4
    if group(i,j)>0
    plot(i,j,'.','Markersize',group(i,j)*150,'color',[1-i/g 1-i/g 1-i/g])
    end
    end
    end

    xlim([0.5 3.5]);
    ylim([0.5 4.5]);
    set(gca,'position',[0.1 0.1 0.8 0.8],'xticklabel',[],'xtick',[1:1:3],'yticklabel',[],'ytick',[1:1:4])
    xxposi=[1 2 3];
    xyposi=0.3*ones(1,3);
    yxposi=0.4*ones(1,4);
    yyposi=[1:1:4];
    text(xxposi,xyposi,{'大馬','中馬','小馬'},'HorizontalAlignment','center','FontSize', 14);
    text(yxposi,yyposi,{'榴槤','香蕉','木瓜','蘋果'},'HorizontalAlignment','right','FontSize', 14);

    回覆刪除

有任何問題可以詢問,我們會盡量回答