羡慕吧?来玩一把吧,哈哈。
- proc iml;
- /* Using SAS to construct a Christmas Tree from an iterated function system,
- and adding ornaments and a star.
- Rick Wicklin 12/14/2012
- To construct an iterated function system in SAS, see
- http://blogs.sas.com/content/iml/2012/12/12/iterated-function-systems-and-barnsleys-fern-in-sas/
- */
- /* 1. Each row is a 2x2 linear transforamtion */
- /* Christmas tree */
- L = {0.03 0 0 0.1,
- 0.85 0.00 0.00 0.85,
- 0.8 0.00 0.00 0.8,
- 0.2 -0.08 0.15 0.22,
- -0.2 0.08 0.15 0.22,
- 0.25 -0.1 0.12 0.25,
- -0.2 0.1 0.12 0.2};
- /* ... and each row is a translation vector */
- B = {0 0,
- 0 1.5,
- 0 1.5,
- 0 0.85,
- 0 0.85,
- 0 0.3,
- 0 0.4
- };
- prob = { 0.02 0.6 0.1 0.07 0.07 0.07 0.07};
- /* For convenience, transpose the L and B matrices */
- L = L`; B = B`;
- /* 3. iterate the discrete stochastic map */
- N = 1e5; /* number of iterations */
- x = j(2,N); k = j(N,1);
- x[,1] = {0, 2}; /* initial point */
- call randseed(1);
- call randgen(k, "Table", prob);
- do i = 2 to N;
- x[,i] = shape(L[,k[i]], 2)*x[,i-1] + B[,k[i]];
- end;
- /* 4. plot the iteration history */
- y = x`;
- create IFS from y[c={"x" "y"}]; append from y; close IFS;
- /* just for fun, create ornaments and colors */
- idx = ceil(N*ranuni(j(500,1)));
- x1 = x[1,idx]`;
- jdx = loc(abs(x1)>0.04);
- idx = idx[jdx];
- x1 = x[1,idx]`;
- y1 = x[2,idx]` - 0.1;
- group = ceil(5*ranuni(j(nrow(idx),1)));
- create Ornaments var {x1 y1 group}; append; close Ornaments;
- quit;
- /* basic IFS Christmas Tree */
- ods graphics / width=200px height=400px;
- proc sgplot data=IFS;
- title "SAS Christmas Tree";
- scatter x=x y=y / markerattrs=(size=1 color=ForestGreen);
- yaxis display=none;
- xaxis display=none;
- run;
- /* Add ornaments and star */
- data Star;
- x2=0; y2=10; output;
- run;
- data All;
- merge IFS Ornaments Star;
- if group=. then group=1;
- run;
- data Attrs;
- length Value MarkerColor $20;
- ID = "Ornaments";
- Value = 1; MarkerColor = "Red "; output;
- Value = 2; MarkerColor = "Blue "; output;
- Value = 3; MarkerColor = "Purple "; output;
- Value = 4; MarkerColor = "Gold "; output;
- Value = 5; MarkerColor = "Chartreuse"; output;
- run;
- *ods graphics / width=400px height=800px;
- proc sgplot data=All noautolegend dattrmap=Attrs;
- title "SAS Christmas Tree";
- scatter x=x y=y / markerattrs=(size=1 color=ForestGreen);
- scatter x=x1 y=y1 / transparency=0.33 attrid=Ornaments
- markerattrs=(size=8 symbol=CircleFilled) group=group;
- scatter x=x2 y=y2 / markerattrs=(color=Gold size=15 symbol=StarFilled);
- yaxis display=none;
- xaxis display=none;
- run;