2006 年 2 月 18 日 23 時 33 分

頻度レポート(フォーマット遊び)


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


今日は、利用頻度を整形して出力してみる。
Perl にはフォーマット機能というのがある。
これを利用して見やすく出力してみよう。

# 出力用の書式を定義する。

# 書式で利用する変数は事前に定義。
my ($num, $rr, $gg, $bb, $count, $ratio);

# 毎ページ先頭に出力するヘッダ。自由な文字列を書ける。
# ピリオド 1 つの行で終了する。

format STDOUT_TOP =
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
.

# レコード用の書式。書式行と、変数行のペアとなる。
# これもピリオド 1 つの行で終了する。
# @ は対応する変数に置換される。
# < は左寄せ、> は右寄せ。他にもある。
# 特別な記号以外はそのまま出力される。

format STDOUT =
@@<< [@>>, @>>, @>>] @>>>>> (@>>>>>>%)
'#', $num, $rr, $gg, $bb, $count, $ratio
.

# $= はページの行数を決める。
# 今回はヘッダ 3 行とデータ 20 行で 23 行とする。
$= = 23;

# $^L ページ区切りに出力される文字。なしにしておく。
$^L = "";

# 割合を表示するために、全ピクセル数を計算しておく。
my $total = @$data * @{$data->[0]};

# レポート開始。
foreach $num (0 .. $#freq) {

    # カラーテーブルを参照して、RGB 値を得る。
    # unpack_rgb 関数は古い日記参照。
    ($rr, $gg, $bb) = unpack_rgb($colors->[$num]);

    # 頻度を書式に割り当てた変数に格納する。
    $count = $freq[$num];

    # 割合は小数を使うので、整数演算を無効にしておく。
    no integer;

    # 出力前に小数以下 2 桁分で書式化しておく。
    $ratio = sprintf('%.2f', $count / $total * 100);

    # 頻度を出力する。
    write;

}

# 最後に、色数を出力する。
# ヒアドキュメント構文だ。<<"終端記号" と書くことで、
# 次の行から終端記号が単独である行までを
# 改行も含めてそのまま文字列として扱う。
# << の後がダブルクォートなので変数も展開される。

print <<"END_OF_DATA";
----------------------------------------
Total $unique colors.
----------------------------------------
END_OF_DATA

さて、実行して出力してみよう。
ばらつきが激しいことが良く分かる。
全く使用されていない色も目立つ。
さて、この結果をどう考えるか。

216 色のものを出力してみたものを書いておく。
ちょっと長いので、行数稼ぎ。

----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#0   [  0,   0,   0]   2190 (   3.24%)
#1   [ 51,   0,   0]    380 (   0.56%)
#2   [102,   0,   0]    165 (   0.24%)
#3   [153,   0,   0]     16 (   0.02%)
#4   [204,   0,   0]      1 (   0.00%)
#5   [255,   0,   0]      0 (   0.00%)
#6   [  0,  51,   0]   1869 (   2.77%)
#7   [ 51,  51,   0]   2221 (   3.29%)
#8   [102,  51,   0]    810 (   1.20%)
#9   [153,  51,   0]    252 (   0.37%)
#10  [204,  51,   0]     26 (   0.04%)
#11  [255,  51,   0]      0 (   0.00%)
#12  [  0, 102,   0]     12 (   0.02%)
#13  [ 51, 102,   0]    196 (   0.29%)
#14  [102, 102,   0]    320 (   0.47%)
#15  [153, 102,   0]    154 (   0.23%)
#16  [204, 102,   0]     51 (   0.08%)
#17  [255, 102,   0]      0 (   0.00%)
#18  [  0, 153,   0]      0 (   0.00%)
#19  [ 51, 153,   0]      1 (   0.00%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#20  [102, 153,   0]     15 (   0.02%)
#21  [153, 153,   0]     61 (   0.09%)
#22  [204, 153,   0]     14 (   0.02%)
#23  [255, 153,   0]      0 (   0.00%)
#24  [  0, 204,   0]      0 (   0.00%)
#25  [ 51, 204,   0]      0 (   0.00%)
#26  [102, 204,   0]      0 (   0.00%)
#27  [153, 204,   0]      1 (   0.00%)
#28  [204, 204,   0]     12 (   0.02%)
#29  [255, 204,   0]      2 (   0.00%)
#30  [  0, 255,   0]      0 (   0.00%)
#31  [ 51, 255,   0]      0 (   0.00%)
#32  [102, 255,   0]      0 (   0.00%)
#33  [153, 255,   0]      0 (   0.00%)
#34  [204, 255,   0]      0 (   0.00%)
#35  [255, 255,   0]      0 (   0.00%)
#36  [  0,   0,  51]   1722 (   2.55%)
#37  [ 51,   0,  51]    100 (   0.15%)
#38  [102,   0,  51]     99 (   0.15%)
#39  [153,   0,  51]     22 (   0.03%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#40  [204,   0,  51]      3 (   0.00%)
#41  [255,   0,  51]      0 (   0.00%)
#42  [  0,  51,  51]  11705 (  17.34%)
#43  [ 51,  51,  51]   8104 (  12.01%)
#44  [102,  51,  51]   1942 (   2.88%)
#45  [153,  51,  51]    245 (   0.36%)
#46  [204,  51,  51]     16 (   0.02%)
#47  [255,  51,  51]      0 (   0.00%)
#48  [  0, 102,  51]    215 (   0.32%)
#49  [ 51, 102,  51]   3343 (   4.95%)
#50  [102, 102,  51]   5746 (   8.51%)
#51  [153, 102,  51]    886 (   1.31%)
#52  [204, 102,  51]     63 (   0.09%)
#53  [255, 102,  51]      2 (   0.00%)
#54  [  0, 153,  51]      0 (   0.00%)
#55  [ 51, 153,  51]      3 (   0.00%)
#56  [102, 153,  51]    248 (   0.37%)
#57  [153, 153,  51]    526 (   0.78%)
#58  [204, 153,  51]    156 (   0.23%)
#59  [255, 153,  51]      2 (   0.00%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#60  [  0, 204,  51]      0 (   0.00%)
#61  [ 51, 204,  51]      0 (   0.00%)
#62  [102, 204,  51]      0 (   0.00%)
#63  [153, 204,  51]     12 (   0.02%)
#64  [204, 204,  51]     75 (   0.11%)
#65  [255, 204,  51]     19 (   0.03%)
#66  [  0, 255,  51]      0 (   0.00%)
#67  [ 51, 255,  51]      0 (   0.00%)
#68  [102, 255,  51]      0 (   0.00%)
#69  [153, 255,  51]      0 (   0.00%)
#70  [204, 255,  51]      0 (   0.00%)
#71  [255, 255,  51]     16 (   0.02%)
#72  [  0,   0, 102]      2 (   0.00%)
#73  [ 51,   0, 102]      0 (   0.00%)
#74  [102,   0, 102]      0 (   0.00%)
#75  [153,   0, 102]      2 (   0.00%)
#76  [204,   0, 102]      3 (   0.00%)
#77  [255,   0, 102]      0 (   0.00%)
#78  [  0,  51, 102]    973 (   1.44%)
#79  [ 51,  51, 102]   1128 (   1.67%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#80  [102,  51, 102]    299 (   0.44%)
#81  [153,  51, 102]     33 (   0.05%)
#82  [204,  51, 102]      8 (   0.01%)
#83  [255,  51, 102]      2 (   0.00%)
#84  [  0, 102, 102]    152 (   0.23%)
#85  [ 51, 102, 102]   3094 (   4.58%)
#86  [102, 102, 102]   4879 (   7.23%)
#87  [153, 102, 102]    626 (   0.93%)
#88  [204, 102, 102]     20 (   0.03%)
#89  [255, 102, 102]      1 (   0.00%)
#90  [  0, 153, 102]      0 (   0.00%)
#91  [ 51, 153, 102]     37 (   0.05%)
#92  [102, 153, 102]   1356 (   2.01%)
#93  [153, 153, 102]   1435 (   2.13%)
#94  [204, 153, 102]    390 (   0.58%)
#95  [255, 153, 102]     22 (   0.03%)
#96  [  0, 204, 102]      0 (   0.00%)
#97  [ 51, 204, 102]      0 (   0.00%)
#98  [102, 204, 102]      5 (   0.01%)
#99  [153, 204, 102]    123 (   0.18%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#100 [204, 204, 102]    197 (   0.29%)
#101 [255, 204, 102]    144 (   0.21%)
#102 [  0, 255, 102]      0 (   0.00%)
#103 [ 51, 255, 102]      0 (   0.00%)
#104 [102, 255, 102]      0 (   0.00%)
#105 [153, 255, 102]      1 (   0.00%)
#106 [204, 255, 102]      4 (   0.01%)
#107 [255, 255, 102]    135 (   0.20%)
#108 [  0,   0, 153]      0 (   0.00%)
#109 [ 51,   0, 153]      0 (   0.00%)
#110 [102,   0, 153]      0 (   0.00%)
#111 [153,   0, 153]      0 (   0.00%)
#112 [204,   0, 153]      0 (   0.00%)
#113 [255,   0, 153]      0 (   0.00%)
#114 [  0,  51, 153]      1 (   0.00%)
#115 [ 51,  51, 153]      1 (   0.00%)
#116 [102,  51, 153]      0 (   0.00%)
#117 [153,  51, 153]      0 (   0.00%)
#118 [204,  51, 153]      0 (   0.00%)
#119 [255,  51, 153]      1 (   0.00%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#120 [  0, 102, 153]      0 (   0.00%)
#121 [ 51, 102, 153]    280 (   0.41%)
#122 [102, 102, 153]    802 (   1.19%)
#123 [153, 102, 153]     74 (   0.11%)
#124 [204, 102, 153]      6 (   0.01%)
#125 [255, 102, 153]      2 (   0.00%)
#126 [  0, 153, 153]      0 (   0.00%)
#127 [ 51, 153, 153]     34 (   0.05%)
#128 [102, 153, 153]   1305 (   1.93%)
#129 [153, 153, 153]   1407 (   2.08%)
#130 [204, 153, 153]    195 (   0.29%)
#131 [255, 153, 153]     10 (   0.01%)
#132 [  0, 204, 153]      0 (   0.00%)
#133 [ 51, 204, 153]      0 (   0.00%)
#134 [102, 204, 153]      1 (   0.00%)
#135 [153, 204, 153]    260 (   0.39%)
#136 [204, 204, 153]    446 (   0.66%)
#137 [255, 204, 153]     69 (   0.10%)
#138 [  0, 255, 153]      0 (   0.00%)
#139 [ 51, 255, 153]      0 (   0.00%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#140 [102, 255, 153]      0 (   0.00%)
#141 [153, 255, 153]      4 (   0.01%)
#142 [204, 255, 153]     15 (   0.02%)
#143 [255, 255, 153]     42 (   0.06%)
#144 [  0,   0, 204]      0 (   0.00%)
#145 [ 51,   0, 204]      0 (   0.00%)
#146 [102,   0, 204]      0 (   0.00%)
#147 [153,   0, 204]      0 (   0.00%)
#148 [204,   0, 204]      0 (   0.00%)
#149 [255,   0, 204]      0 (   0.00%)
#150 [  0,  51, 204]      0 (   0.00%)
#151 [ 51,  51, 204]      0 (   0.00%)
#152 [102,  51, 204]      0 (   0.00%)
#153 [153,  51, 204]      0 (   0.00%)
#154 [204,  51, 204]      0 (   0.00%)
#155 [255,  51, 204]      0 (   0.00%)
#156 [  0, 102, 204]      0 (   0.00%)
#157 [ 51, 102, 204]      0 (   0.00%)
#158 [102, 102, 204]      1 (   0.00%)
#159 [153, 102, 204]      0 (   0.00%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#160 [204, 102, 204]      0 (   0.00%)
#161 [255, 102, 204]      0 (   0.00%)
#162 [  0, 153, 204]      0 (   0.00%)
#163 [ 51, 153, 204]      0 (   0.00%)
#164 [102, 153, 204]     48 (   0.07%)
#165 [153, 153, 204]    104 (   0.15%)
#166 [204, 153, 204]     12 (   0.02%)
#167 [255, 153, 204]      5 (   0.01%)
#168 [  0, 204, 204]      0 (   0.00%)
#169 [ 51, 204, 204]      0 (   0.00%)
#170 [102, 204, 204]      0 (   0.00%)
#171 [153, 204, 204]    148 (   0.22%)
#172 [204, 204, 204]    595 (   0.88%)
#173 [255, 204, 204]     89 (   0.13%)
#174 [  0, 255, 204]      0 (   0.00%)
#175 [ 51, 255, 204]      0 (   0.00%)
#176 [102, 255, 204]      0 (   0.00%)
#177 [153, 255, 204]      0 (   0.00%)
#178 [204, 255, 204]    131 (   0.19%)
#179 [255, 255, 204]    281 (   0.42%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#180 [  0,   0, 255]      0 (   0.00%)
#181 [ 51,   0, 255]      0 (   0.00%)
#182 [102,   0, 255]      0 (   0.00%)
#183 [153,   0, 255]      0 (   0.00%)
#184 [204,   0, 255]      0 (   0.00%)
#185 [255,   0, 255]      0 (   0.00%)
#186 [  0,  51, 255]      0 (   0.00%)
#187 [ 51,  51, 255]      0 (   0.00%)
#188 [102,  51, 255]      0 (   0.00%)
#189 [153,  51, 255]      0 (   0.00%)
#190 [204,  51, 255]      0 (   0.00%)
#191 [255,  51, 255]      0 (   0.00%)
#192 [  0, 102, 255]      0 (   0.00%)
#193 [ 51, 102, 255]      0 (   0.00%)
#194 [102, 102, 255]      0 (   0.00%)
#195 [153, 102, 255]      0 (   0.00%)
#196 [204, 102, 255]      0 (   0.00%)
#197 [255, 102, 255]      0 (   0.00%)
#198 [  0, 153, 255]      0 (   0.00%)
#199 [ 51, 153, 255]      0 (   0.00%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#200 [102, 153, 255]      0 (   0.00%)
#201 [153, 153, 255]      0 (   0.00%)
#202 [204, 153, 255]      0 (   0.00%)
#203 [255, 153, 255]      0 (   0.00%)
#204 [  0, 204, 255]      0 (   0.00%)
#205 [ 51, 204, 255]      0 (   0.00%)
#206 [102, 204, 255]      0 (   0.00%)
#207 [153, 204, 255]      2 (   0.00%)
#208 [204, 204, 255]     24 (   0.04%)
#209 [255, 204, 255]     17 (   0.03%)
#210 [  0, 255, 255]      0 (   0.00%)
#211 [ 51, 255, 255]      0 (   0.00%)
#212 [102, 255, 255]      0 (   0.00%)
#213 [153, 255, 255]      0 (   0.00%)
#214 [204, 255, 255]     62 (   0.09%)
#215 [255, 255, 255]   1916 (   2.84%)
#216 [  0,   0,   0]      0 (   0.00%)
#217 [  0,   0,   0]      0 (   0.00%)
#218 [  0,   0,   0]      0 (   0.00%)
#219 [  0,   0,   0]      0 (   0.00%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#220 [  0,   0,   0]      0 (   0.00%)
#221 [  0,   0,   0]      0 (   0.00%)
#222 [  0,   0,   0]      0 (   0.00%)
#223 [  0,   0,   0]      0 (   0.00%)
#224 [  0,   0,   0]      0 (   0.00%)
#225 [  0,   0,   0]      0 (   0.00%)
#226 [  0,   0,   0]      0 (   0.00%)
#227 [  0,   0,   0]      0 (   0.00%)
#228 [  0,   0,   0]      0 (   0.00%)
#229 [  0,   0,   0]      0 (   0.00%)
#230 [  0,   0,   0]      0 (   0.00%)
#231 [  0,   0,   0]      0 (   0.00%)
#232 [  0,   0,   0]      0 (   0.00%)
#233 [  0,   0,   0]      0 (   0.00%)
#234 [  0,   0,   0]      0 (   0.00%)
#235 [  0,   0,   0]      0 (   0.00%)
#236 [  0,   0,   0]      0 (   0.00%)
#237 [  0,   0,   0]      0 (   0.00%)
#238 [  0,   0,   0]      0 (   0.00%)
#239 [  0,   0,   0]      0 (   0.00%)
----------------------------------------
Num  [ R ,  G ,  B ]  Count (  Ratio%)
----------------------------------------
#240 [  0,   0,   0]      0 (   0.00%)
#241 [  0,   0,   0]      0 (   0.00%)
#242 [  0,   0,   0]      0 (   0.00%)
#243 [  0,   0,   0]      0 (   0.00%)
#244 [  0,   0,   0]      0 (   0.00%)
#245 [  0,   0,   0]      0 (   0.00%)
#246 [  0,   0,   0]      0 (   0.00%)
#247 [  0,   0,   0]      0 (   0.00%)
#248 [  0,   0,   0]      0 (   0.00%)
#249 [  0,   0,   0]      0 (   0.00%)
#250 [  0,   0,   0]      0 (   0.00%)
#251 [  0,   0,   0]      0 (   0.00%)
#252 [  0,   0,   0]      0 (   0.00%)
#253 [  0,   0,   0]      0 (   0.00%)
#254 [  0,   0,   0]      0 (   0.00%)
#255 [  0,   0,   0]      0 (   0.00%)
----------------------------------------
Total 109 colors.
----------------------------------------



Copyright (c) 1994-2007 Project Loafer. All rights reserved.