@Rick_SAS
Your video about heat maps in SAS/IML https://youtu.be/GgBOfVcz0vE inspired me to put it into practice.
As your Do Loop blog is my tool box and my first resort when encountering a problem, you'll find many code snippets from the Do Loop rebuilt into this code.
The motivation for this program is to give my daughter a sense of prices. And although she does well in mathematics it's easier to grap the magnitude visually.
Therefore I convert the price in Euros into a 0,1 square matrix whose dimensions I determine using the root function froot.
As an optimisation I'd like to scale the ods graphic elements like title and markers according to the dimension of the matrix.
Is there a way I can calculate their optimal size?
ODS HTML FILE="C:\USERS\DKXENLO\DESKTOP\OUTOUT\FLIGHTS.HTM"
NOGTITLE GPATH="C:\USERS\DKXENLO\DESKTOP\OUTOUT\" ;
ODS GRAPHICS / WIDTH=3000 HEIGHT=3000 IMAGENAME='FLIGHTS' NOBORDER ;
PROC IML;
PRICE=1709;
PRICE=CEIL(PRICE);
START FUNC (X) GLOBAL (PRICE);
RETURN ( X*(X+1)/2 -PRICE);
FINISH;
SOL=FROOT("FUNC",{0, 100});
MONEY=J(CEIL(SOL), CEIL(SOL),.);
START ROW (M);
RETURN(REPEAT(T(1:NROW(M)),1, NCOL(M)));
FINISH;
START COL (M);
RETURN(REPEAT(1:NROW(M), NROW(M)));
FINISH;
START GETDIAGIDX(A);
DIAGIDX = DO(1,NROW(A)*NCOL(A), NCOL(A)+1); /* INDEX DIAGONAL ELEMENTS */
RETURN(DIAGIDX); /* RETURN */
FINISH;
R=ROW(MONEY);
C=COL(MONEY);
LOW_TRI= (R >= C);
LOW_IDX=LOC(LOW_TRI ^= 0);
DIAGIDX=GETDIAGIDX(LOW_TRI);
EXCESS=NCOL(LOW_IDX)-PRICE;
EXCESS_ID=(NCOL(DIAGIDX)-EXCESS+1):NCOL(DIAGIDX);
LOW_TRI[DIAGIDX[EXCESS_ID]]=-1;
DIM=DIMENSION(MONEY);
H1=NDX2SUB(DIM,LOC(LOW_TRI=1));
CALL SYMPUTX("PRICE", PRICE);
RAMP={BWH "WHITE" "LIGHTBLUE" };
CALL HEATMAPDISC(LOW_TRI, RAMP) TITLE=CHAR(PRICE)+" EUROS";
CREATE SPEND FROM H1;
APPEND FROM H1;
CLOSE;
SUBMIT;
DATA SPEND;
SET SPEND;
MONEDA="EURO";
RUN;
TITLE " %SYSFUNC(PUTN(&PRICE,EURO9.2)) IS THAT MUCH MONEY VISUALLY";
PROC SGPLOT DATA=SPEND NOBORDER ;
SYMBOLIMAGE NAME=EURO IMAGE='C:\USERS\DKXENLO\DESKTOP\OUTOUT\1EUROA.JPG';
STYLEATTRS DATASYMBOLS=(EURO);
SCATTER X=COL1 Y=COL2 / GROUP=MONEDA MARKERATTRS=(SIZE=22);
XAXIS REVERSE DISPLAY=NONE;
YAXIS DISPLAY=NONE;
RUN;
ENDSUBMIT;
ODS HTML CLOSE;
... View more