This is post to share how to make a heatmap based on a correlation matrix (as in picture attached).
I'm sure there other (and better) ways to do it, so feel free signal these below. Also feel free to convert this to an ado if you feel so.
I hope it helps someone:
I'm sure there other (and better) ways to do it, so feel free signal these below. Also feel free to convert this to an ado if you feel so.
I hope it helps someone:
Code:
// correlation definitions // ----------------------- sysuse auto, clear loc myvars price mpg rep78 headroom weight length displacement gear_ratio foreign pwcorr `myvars' mat A = r(C) clear svmat2 A, rnames(vars) gen id1 = _n reshape long A, i(vars) j(id2) order vars id1 id2 A sort id1 id2 ren A corr format %9.3f corr // heatmap definitions // ------------------- loc targetvar corr loc xnum id1 loc ynum id2 loc num = 0 loc labels = "" foreach x of loc myvars { loc num = `num'+1 loc ylabels = `"`ylabels' `num' "`x'""' loc xlabels = `"`xlabels' `num' "' } di `"`ylabels'"' di `"`xlabels'"' * colors & options * ---------------- loc poscol blue // green loc negcol yellow // red loc msize = 5 // marker size loc posmlabc white // label colors loc negmlabc black // label colors loc mlabs = 2 // label size loc hmoptions = `"leg(off) xsize(10) ysize(10) ysc(rev) xsc(alt) plotr(fc(white) lc(black) m(3 3 3 3)) graphr(c(white)) xtitle(" ") ytitle(" ") "' * thresholds * ---------- loc posmax = 1 loc negmax = -1 loc posstep = 10 // add more or less positive shades loc negstep = 10 // add more or less negative shades loc myhm = "" // positive val loops loc step= `posmax'/`posstep' loc prevx = 0 forv x = 0 (`step') `posmax' { loc myhm = "`myhm' (scatter `ynum' `xnum' if `targetvar'>`prevx' & `targetvar'<=`x'" /// + ", ml(`targetvar') mlabs(`mlabs') mlabc(`posmlabc') mlabpos(0) m(S) msize(`msize') mc(`poscol'*" /// + strofreal(`x'/`posmax')+"))" loc prevx = `x' di "`x'" } loc myhm = "`myhm' (scatter `ynum' `xnum' if `targetvar'>`prevx' & `targetvar'<=`posmax'" /// + ", ml(`targetvar') mlabs(`mlabs') mlabc(`posmlabc') mlabpos(0) m(S) msize(`msize') mc(`poscol'*1))" // negative val loops loc step= `negmax'/`negstep' loc prevx = 0 forv x = 0 (`step') `negmax' { loc myhm = "`myhm' (scatter `ynum' `xnum' if `targetvar'<`prevx' & `targetvar'>=`x'" /// + ", ml(`targetvar') mlabs(`mlabs') mlabc(`negmlabc') mlabpos(0) m(S) msize(`msize') mc(`negcol'*" /// + strofreal(`x'/`negmax')+"))" loc prevx = `x' di "`x'" } loc myhm = "`myhm' (scatter `ynum' `xnum' if `targetvar'<`prevx' & `targetvar'>=`negmax'" /// + ", ml(`targetvar') mlabs(`mlabs') mlabc(`negmlabc') mlabpos(0) m(S) msize(`msize') mc(`negcol'*1))" di "`myhm'" gr tw `myhm' , `hmoptions' /// ylabel(`ylabels' , noticks labs(2.66) labgap(vsmall) angle(0) nogrid) /// xlabel(`xlabels' , noticks labs(2.66) labgap(vsmall) angle(0) nogrid )
Comment