箱ひげ図の作成
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);
[このページのトップへ]