%let name=cardiovascular_disease_mortality; /* Set your current-working-directory (to read/write files), if you need to ... %let rc=%sysfunc(dlgcdir('c:\someplace\public_html')); */ filename odsout '.'; /* Imitation/enhancement of several graphs I had seen on the web in the early 2000s, such as: https://www.joslin.org/docs/Coronary_Artery_Disease_in_Women_-_Dr_Manson_presentation.pdf http://biomed.brown.edu/Courses/BI108/BI108_2005_Groups/02/mortality.htm Using 3 data series from: https://wonder.cdc.gov/mortSQL.html */ options obs=41; proc import datafile="cvd_mortality_1979_1998.txt" out=my_data_1979_1998 (keep = year gender deaths population crude_rate) dbms=dlm replace; delimiter='09'x; getnames=yes; datarow=2; guessingrows=all; run; options obs=max; options obs=37; proc import datafile="cvd_mortality_1999_2016.txt" out=my_data_1999_2016 (keep = year gender deaths population crude_rate) dbms=dlm replace; delimiter='09'x; getnames=yes; datarow=2; guessingrows=all; run; options obs=max; options obs=23; proc import datafile="cvd_mortality_1968_1978.txt" out=my_data_1968_1978 (keep = year gender deaths population crude_rate) dbms=dlm replace; delimiter='09'x; getnames=yes; datarow=2; guessingrows=all; run; options obs=max; data my_data; set my_data_1968_1978 (rename=(year=year_char)) my_data_1979_1998 (rename=(year=year_char)) my_data_1999_2016 (rename=(year=year_char)) ; year=.; year=year_char; run; proc sort data=my_data out=my_data; by year gender; run; data my_data_deaths; set my_data (keep = year gender deaths); run; proc transpose data=my_data_deaths out=my_data_deaths (rename=(male=male_deaths female=female_deaths)); by year; id gender; run; data my_data_deathrate; set my_data (keep = year gender crude_rate); run; proc transpose data=my_data_deathrate out=my_data_deathrate (rename=(male=male_deathrate female=female_deathrate)); by year; id gender; run; data anno_deaths_text; set my_data_deaths (where=(year=2016)); length label $100 anchor x1space y1space $50; layer="front"; function="text"; textcolor="gray33"; textsize=10; width=100; widthunit='percent'; x1space='datavalue'; y1space='datavalue'; anchor='top'; x1=year; y1=male_deaths; label="Male"; anchor="bottomleft"; output; y1=female_deaths; label="Female"; anchor="topleft"; output; run; data anno_deathrate_text; set my_data_deathrate (where=(year=2016)); length label $100 anchor x1space y1space $50; layer="front"; function="text"; textcolor="gray33"; textsize=10; width=100; widthunit='percent'; x1space='datavalue'; y1space='datavalue'; anchor='center'; x1=year; y1=male_deathrate; label="Male"; anchor="bottomleft"; output; y1=female_deathrate; label="Female"; anchor="topleft"; output; run; data anno_icd; length label $100 anchor x1space y1space $50; layer="front"; function="text"; textcolor="purple"; textsize=10; textweight='normal'; width=100; widthunit='percent'; x1space='datavalue'; y1space='wallpercent'; y1=0; anchor='bottom'; x1=1972.5; label="ICD8 390-458"; output; x1=1988.0; label="ICD9 390-459"; output; x1=2007.5; label="ICD10 100-199"; output; run; ODS LISTING CLOSE; ODS HTML path=odsout body="&name..htm" (title="Cardiovascular Disease Mortality") style=htmlblue; ods graphics / imagemap tipmax=2500 imagefmt=png imagename="&name" width=900px height=550px noborder; proc sql noprint; select min(year) into :minyear separated by ' ' from my_data; select max(year) into :maxyear separated by ' ' from my_data; quit; run; title1 c=gray33 h=16pt "Cardiovascular Disease Mortality Trends"; title2 c=gray33 h=16pt "For U.S. Males and Females (&minyear-&maxyear)"; footnote1 c=gray33 h=11pt "Data source: " c=purple "https://wonder.cdc.gov/mortSQL.html"; /* proc sgplot data=my_data_deaths; series x=year y=male_deaths; series x=year y=female_deaths; keylegend / position=topright location=inside across=1; run; proc sgplot data=my_data_deaths noautolegend; label male_deaths='Male' female_deaths='Female'; format male_deaths female_deaths comma10.0; series x=year y=male_deaths / lineattrs=(color=gray33 thickness=8px) tip=none; series x=year y=male_deaths / lineattrs=(color=cx7abfff thickness=5px) tip=none name='blue'; series x=year y=female_deaths / lineattrs=(color=gray33 thickness=8px) tip=none; series x=year y=female_deaths / lineattrs=(color=pink thickness=5px) tip=none name='pink'; yaxis label='Deaths' grid; xaxis display=(nolabel) grid; keylegend "blue" "pink" / across=1 position=topright location=inside linelength=10px noborder outerpad=4px; run; */ data anno_all; set anno_deaths_text anno_icd; run; ods html anchor='deaths'; proc sgplot data=my_data_deaths noautolegend pad=(right=4pct bottom=3pct) sganno=anno_all; format male_deaths female_deaths comma10.0; series x=year y=male_deaths / lineattrs=(color=gray33 thickness=8px) tip=none; series x=year y=male_deaths / lineattrs=(color=cx7abfff thickness=5px) tip=none; scatter x=year y=male_deaths / markerattrs=(color=gray33 symbol=circle size=8px); series x=year y=female_deaths / lineattrs=(color=gray33 thickness=8px) tip=none; series x=year y=female_deaths / lineattrs=(color=pink thickness=5px) tip=none; scatter x=year y=female_deaths / markerattrs=(color=gray33 symbol=circle size=8px); refline 1978.5 1998.5 / axis=x lineattrs=(color=purple); yaxis label='Deaths' labelattrs=(color=gray33 weight=bold size=16px) values=(375000 to 575000 by 25000) valueattrs=(weight=bold size=15px) grid gridattrs=(pattern=dot color=gray88) /*offsetmin=0*/ offsetmax=0; xaxis display=(nolabel) values=(1965 to 2020 by 5) valueattrs=(weight=bold size=15px) grid gridattrs=(pattern=dot color=gray88) offsetmin=0 offsetmax=0; run; data anno_all; set anno_deaths_text anno_icd; run; ods html anchor='deaths0'; proc sgplot data=my_data_deaths noautolegend pad=(right=4pct bottom=3pct) sganno=anno_all; format male_deaths female_deaths comma10.0; series x=year y=male_deaths / lineattrs=(color=gray33 thickness=8px) tip=none; series x=year y=male_deaths / lineattrs=(color=cx7abfff thickness=5px) tip=none; scatter x=year y=male_deaths / markerattrs=(color=gray33 symbol=circle size=8px); series x=year y=female_deaths / lineattrs=(color=gray33 thickness=8px) tip=none; series x=year y=female_deaths / lineattrs=(color=pink thickness=5px) tip=none; scatter x=year y=female_deaths / markerattrs=(color=gray33 symbol=circle size=8px); refline 1978.5 1998.5 / axis=x lineattrs=(color=purple); yaxis label='Deaths' labelattrs=(color=gray33 weight=bold size=16px) values=(0 to 600000 by 100000) valueattrs=(weight=bold size=15px) grid gridattrs=(pattern=dot color=gray88) offsetmin=0 offsetmax=0; xaxis display=(nolabel) values=(1965 to 2020 by 5) valueattrs=(weight=bold size=15px) grid gridattrs=(pattern=dot color=gray88) offsetmin=0 offsetmax=0; run; data anno_all; set anno_deathrate_text anno_icd; run; ods html anchor='rate'; proc sgplot data=my_data_deathrate noautolegend pad=(right=4pct bottom=3pct) sganno=anno_all; format male_deathrate female_deathrate comma10.0; series x=year y=male_deathrate / lineattrs=(color=gray33 thickness=8px) tip=none; series x=year y=male_deathrate / lineattrs=(color=cx7abfff thickness=5px) tip=none; scatter x=year y=male_deathrate / markerattrs=(color=gray33 symbol=circle size=8px); series x=year y=female_deathrate / lineattrs=(color=gray33 thickness=8px) tip=none; series x=year y=female_deathrate / lineattrs=(color=pink thickness=5px) tip=none; scatter x=year y=female_deathrate / markerattrs=(color=gray33 symbol=circle size=8px); refline 1978.5 1998.5 / axis=x lineattrs=(color=purple); yaxis label='Death Rate per 100,000' labelattrs=(color=gray33 weight=bold size=16px) values=(0 to 600 by 100) valueattrs=(weight=bold size=15px) grid gridattrs=(pattern=dot color=gray88) offsetmin=0 offsetmax=0; xaxis display=(nolabel) values=(1965 to 2020 by 5) valueattrs=(weight=bold size=15px) grid gridattrs=(pattern=dot color=gray88) offsetmin=0 offsetmax=0; run; quit; ODS HTML CLOSE; ODS LISTING;