I'm sure @tc will post an awesome Christmas-themed graphic soon, but you can enjoy this one until he does:
/* A normal Christmas tree: Each branch is a normal PDF (shaded) */
data NormalTree;
array x[101]; /* for efficiency, store (x, phi(x)) values in an array */
array phi[101];
/* compute the standard normal PDF on [-xMax,xMax] */
xMax = 2.5;
dx = 2*xMax / (dim(x)-1); /* step size for x */
do i = 1 to dim(x);
x[i] = -xMax + (i-1)*dx; /* the i_th point in [-xMax,xMax] */
phi[i] = pdf("Normal", x[i]); /* phi(x) is normal PDF */
end;
b = 4; /* width of the tree base; the interval is [-b/2, b/2] */
h = 6; /* height of tree; the interval is [0, h] */
nSegs = 8; /* number of normal curves to overlay to construct the tree */
/* linear transformation of Y from [0,maxPhi] to [0, 2*dy]. Use for ALL branches. */
maxPhi = pdf("Normal", 0);
dy = h / (nSegs+1); /* height of each normal curve */
do i = 1 to dim(x);
phi[i] = 2*dy / maxPhi * phi[i];
end;
/* Translate curve and baseline up by k*dy units.
Linearly transform X from [-xMax,xMax] to [-xR, xR].
If you slice the right triangle with base b/2 and height h
at L=k*dy, the width of the slice is xR = (b/2)/h * (h-L) */
do k = 0 to nSegs-1;
baseline = k*dy;
xR = (b/2)/h * (h - baseline);
do i = 1 to dim(x);
t = xR / xMax * x[i]; /* t is the scaled version of X for k_th branch */
y = baseline + phi[i]; /* vertically translate Y values */
output;
end;
end;
keep k i baseline t y;
run;
/* Fill/shade the PDF: https://blogs.sas.com/content/iml/2015/07/20/density-shaded-tails.html */
ods graphics / width=480px height=480px;
title "A Normal Christmas Tree";
proc sgplot data=NormalTree noautolegend aspect=1 noborder;
band x=t upper=y lower=baseline / group=k fill fillattrs=(color=DarkGreen) outline lineattrs=(color=black);
xaxis display=none;
yaxis display=none;
run;
How did he do that? See https://blogs.sas.com/content/iml/2024/12/16/normal-christmas-tree.html
And I acknowledge @Ksharp for his inspiration last year.
Rick,
I have already read your blog .GREAT !
I think you should rename this post as
Fun With SAS ODS Graphics: A normal Christmas tree
to make @tc notice it .
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.