箱ひげ図の作成

Last modified: 2019 年 01 月 12 日 00 時

箱ひげ図の作成を半自動でできるようにします。KeTCindy版はこちら

主な使用関数: Htickmark, Vtickmark, Setorigin, Listplot, Framedata.

箱ひげ図の作成

使い方

ここでは、複数クラスの試験結果を箱ひげ図で表わすシーンを想定しています。このscilabファイルをダウンロードして、下記のように、クラス名、クラス数、各クラスの最大値・最小値・四分位数・平均値を入力します:

////入力ここから/////////////////////////////////////////////////////////

name=['クラスA', 'クラスB', 'クラスC']; //項目名のリスト
n_item=3; //項目の数
file_name='hakohige_sample3';
title='タイトル';
M=[15,46,65,78,93,64;..  //最小値, 1/4, 2/4, 3/4, 最大値, 平均値の順
   20,48,55,70,100,58;..
   35,50,75,82,98,68];

////入力ここまで/////////////////////////////////////////////////////////

ここでは、3クラスで入力しています。あとは、全体を実行すれば、箱ひげ図のTeXファイルが得られます。

[このページのトップへ]

各プロットデータの説明

下記のプロットデータは次のようになります:

箱ひげ図の描画

//箱ひげ
Box=list();
for N=1:n_item
  L=2*N-1;
  w=0.5;
  Box($+1)=Framedata([L-w,L+w], [M(N,2),M(N,4)]); //箱
  Box($+1)=Listplot([L-w,M(N,3)], [L+w,M(N,3)]); //中央値
  Box($+1)=Listplot([L-w/2,M(N,1)], [L+w/2,M(N,1)]); //ひげ
  Box($+1)=Listplot([L-w/2,M(N,5)], [L+w/2,M(N,5)]); //
  Box($+1)=Listplot([L,M(N,1)], [L,M(N,2)]); //中心線
  Box($+1)=Listplot([L,M(N,4)], [L,M(N,5)]); //
end

//平均値の印
Ave=list();
d=1;
dx=d*mult;
dy=d;
for N=1:n_item
  L=2*N-1;
  Ave($+1)=Listplot([L,M(N,6)-dy],[L,M(N,6)+dy]);
  Ave($+1)=Listplot([L-dx,M(N,6)],[L+dx,M(N,6)]);
end

//外枠
axisL=Listplot([0,0],[0,100]);
axisR=Listplot([2*n_item,0],[2*n_item,100]);
baseline=Listplot([0,0], [2*n_item,0]);

[このページのトップへ]

ソースコード

scilabファイル(.sce)のダウンロード
tic();

////入力ここから/////////////////////////////////////////////////////////

name=['クラスA', 'クラスB', 'クラスC']; //項目名のリスト
n_item=3; //項目の数
file_name='hakohige_sample3';
title='タイトル';
M=[15,46,65,78,93,64;..  //最小値,1/4,2/4,3/4,最大値,平均値の順
   20,48,55,70,100,58;..
   35,50,75,82,98,68];

////入力ここまで/////////////////////////////////////////////////////////

mult=0.07;
Setscaling(mult);
Setwindow([-1,2*n_item+1], [-2,102]);

//箱ひげ
Box=list();
for N=1:n_item
  L=2*N-1;
  w=0.5;
  Box($+1)=Framedata([L-w,L+w], [M(N,2),M(N,4)]); //箱
  Box($+1)=Listplot([L-w,M(N,3)], [L+w,M(N,3)]); //中央値
  Box($+1)=Listplot([L-w/2,M(N,1)], [L+w/2,M(N,1)]); //ひげ
  Box($+1)=Listplot([L-w/2,M(N,5)], [L+w/2,M(N,5)]); //
  Box($+1)=Listplot([L,M(N,1)], [L,M(N,2)]); //中心線
  Box($+1)=Listplot([L,M(N,4)], [L,M(N,5)]); //
end

//平均値の印
Ave=list();
d=1;
dx=d*mult;
dy=d;
for N=1:n_item
  L=2*N-1;
  Ave($+1)=Listplot([L,M(N,6)-dy],[L,M(N,6)+dy]);
  Ave($+1)=Listplot([L-dx,M(N,6)],[L+dx,M(N,6)]);
end

//外枠
axisL=Listplot([0,0],[0,100]);
axisR=Listplot([2*n_item,0],[2*n_item,100]);
baseline=Listplot([0,0], [2*n_item,0]);

Openfile(strcat(['tex/', string(file_name), '.tex']));
Beginpicture('1.5cm');
Setax(6, ' ');
Drwline(Box, axisL, axisR, baseline, 2);
Drwline(Ave, 1.5);

for i=1:n_item
  L=2*i-1;
  Letter([L,0], 's2', name(i));
end
Fontsize('la');
Letter([n_item,106], 'c', title);
Fontsize('n');

//目盛り
Setpen(2);
Lx=0; //左端
Setorigin([Lx,0]); 
for i=0:20
  Vtickmark(0+5*i, ' ');
end
for i=0:10
  Expr([Lx,10*i], 'w2', string(10*i));
end

Rx=2*n_item; //右端
Setorigin([Rx,0]);
for i=0:20
  Vtickmark(0+5*i, ' '); //5点ごとの目盛り
end
for i=0:10
  Expr([Rx,10*i], 'e2', string(10*i)); //10点ごとの目盛りと値
end
for i=1:n_item
  L=2*i-1;
  Htickmark(L, ''); //各項目の目盛り
end
Setpen(1);
Endpicture(0);
Closefile();

T=toc();
disp(T);

[このページのトップへ]