OpenResearchの,こちらの論文を読んで凄く感銘をうけました
Raincloud plots: a multi-platform tool for robust data visualization
https://wellcomeopenresearch.org/articles/4-63
Raincloud plotへの並々ならぬ愛もなんですが,データビジュアライゼーションへの真摯な知見もですし,なによりWebコミュニティの集合知を最大限に活用しており,非常にいいなと.
だけど,まあ,しょうがないんですけど,SASで描いたバージョンはないのです(笑)
ということで,今年の某総会の発表ネタの1本はRainCloud PlotにSASバージョンの彩りを加えるにしようかなとか思ってます
個別の値にマウスオンしたら,どのサンプルで,どんな値かもバッチリ表示
まだまだここから磨いていかねばと思ってますがとりあえず.
datalatticeとprototypeでカテゴリ分割してますが,次は時系列で,代表値推移を線で結んで雷にみたてたバージョンもやりたいので,それだと今のやり方だとまずいですからね
また考えようかなと思ってます
%let outpath=XXXXX;
/*Test dataset*/
data test;
call streaminit(1080);
GROUP="A";
do id=1 to 200;
val=rand("normal",10,5);
output;
end;
do id=201 to 400;
val=rand("normal",30,5);
output;
end;
GROUP="B";
do id=1 to 200;
val=rand("normal",18,5);
output;
end;
do id=201 to 400;
val=rand("normal",22,5);
output;
end;
run;
/* calculation----kernel density estimation*/
proc kde data = test ;
univar val /out=kde ;
by GROUP;
run;
/* calculation----for box-and-whisker*/
ods _all_ close;
ods output SGPlot=box;
proc sgplot data=test;
vbox val/group=group;
run;
ods html;
/*dataset-fix*/
data wk2;
set kde(in=ina)
box(in=inb where=(^missing(BOX_VAL_GROUP_GROUP____Y)))
test(in=inc)
;
call streaminit(0615);
if ina then low=0;
if missing(BOX_VAL_GROUP_GROUP___ST) then BOX_VAL_GROUP_GROUP___ST="DUMMY";
if ^missing(BOX_VAL_GROUP_GROUP___GP) then group=BOX_VAL_GROUP_GROUP___GP;
if inb then dummy_x=-0.01;
if inc then do;
dummy_y=-0.05;
random=rand("uniform")*0.01;
if ranuni(777)<0.5 then dummy_y=dummy_y - random;
else dummy_y=dummy_y + random;
end;
run;
/*Plot-define*/
ods graphics on /imagemap=on tipmax=5000;
ods html path="&outpath" file="test.html";
proc template ;
define statgraph RCP ;
begingraph;
entrytitle "Rain Cloud Plot";
layout datalattice rowvar=group/ columnaxisopts=(label="Value") rowaxisopts=(display=none);
layout prototype;
bandplot x=value limitupper=density limitlower=low / display=all ;
boxplotparm y=BOX_VAL_GROUP_GROUP____Y x=dummy_x stat=BOX_VAL_GROUP_GROUP___ST /boxwidth=0.3 orient = horizontal ;
scatterplot x=val y=dummy_y/ jitter=auto jitteropts=(axis=Y width=1) markerattrs=(symbol=circle size=8 transparency=0.4)
rolename=(tip1=ID tip2=VAL)
tip=(tip1 tip2)
tiplabel=(tip1="ID" tip2="Value")
;
endlayout;
endlayout;
endgraph;
end;
run;
/*Plot-submit*/
proc sgrender data=wk2 template=RCP ;
run;
ods html close;
0 件のコメント:
コメントを投稿