program define gsagraph

	version  9
	syntax varlist [if] [in], [TAU(numlist >0)] [TSTAT(numlist)] [CORrelation] [FRACtional] [QUADratic] [LOWEss] [nplots(int 5)] [SCATTER]

	*	COUNTING NUMBER OF THE VARIABLES
	local nvar = 0
	foreach var in `varlist' {
		local nvar = `nvar' + 1
	}
	local nvar_sub1 = `nvar'-1
	local nvar_sub2 = `nvar'-2


	*	ERROR MESSAGES
	if `nplots' > 10 {							/* ADDED IN V18 */
		local nplots = 10
		display ""
		display as text "Maximum number of nplots is 10. The first 10 variables are ploted."
	}

	if `nplots' > `nvar_sub2' {					/* ADDED IN V18 */
		local nplots = `nvar_sub2'
		display ""
		display as text "Maximum # of nplots (or the default value of 5) is larger than the # of covariates in the model. All covariates will be plotted."
	}

	gettoken y rhs : varlist
	gettoken t X :rhs
	tokenize `X'

	if "`tau'" != "" {							/* ADDED IN V16 */
		local qoi_lab "tau"
		local qoi_val `tau'
	}
	else {
		local qoi_lab "t-value"
		local qoi_val `tstat'
	}

	if "`print'" != "noprint" & "`fractional'" == "" & "`quadratic'" == "" & "`lowess'" == "" {			/* ADDED IN V21 */
		local fractional "fractional"
		display as text "Graph option is not selected. Contour is drawn with fractional polynomial."
		display ""
	}

	if "`fractional'" != "" {
		local graphtype "fpfit"
		noisily display "Contour is drawn with fractional polynomial."
	}
	if "`quadratic'" != "" {
		local graphtype "qfit"
		noisily display "Contour is drawn with quadratic prediction."
	}
	if "`lowess'" != "" {
		local graphtype "lowess"
		noisily display "Contour is drawn with lowess smoothing."
	}

	if "`correlation'" != "" {
		local vars "gsa_rho_res_yu gsa_rho_res_tu"
		local ytitle "Partial Correlation for Outcome"
		local xtitle "Partial Correlation for Assignment"
		local xycrd "rho_res"
	}
	else {
		local vars "gsa_partial_rsq_y gsa_partial_rsq_t"
		local ytitle "Partial R-sq for Outcome"
		local xtitle "Partial R-sq for Assignment"
		local xycrd "partial_rsq"
	}

	forvalues k = 0/`nplots' {
		local xcrd`k' = abs(gsa_`xycrd'_tx[`k'])
		local ycrd`k' = abs(gsa_`xycrd'_yx[`k'])
		if `xcrd`k'' >1 {
			local xcrd`k' = 1
		}
		if `ycrd`k'' >1 {
			local ycrd`k' = 1
		}
	}

	*	SCATTER OPTION
	if "`scatter'" != "" {							/* ADDED IN V16 */
		local gsa_scatter "(scatter `vars' `if', mcolor(midblue) msize(small) msymbol(circle_hollow) mlcolor(midblue) mlwidth(vvvthin))"
	}

	forvalues np = 1/`nplots' {
		local gsa_crd`np' "(scatteri `ycrd`np'' `xcrd`np'' "``np''", mcolor(edkblue) msize(medsmall) msymbol(plus) mlabsize(small) mlabcolor(emidblue)) "
	}

	twoway (`graphtype' `vars' `if', lcolor(midblue) lwidth(thin)) `gsa_scatter' `gsa_crd1' `gsa_crd2' `gsa_crd3' `gsa_crd4' `gsa_crd5' `gsa_crd6' `gsa_crd7' `gsa_crd8' `gsa_crd9' `gsa_crd10' ///
	, ytitle(`ytitle') xtitle(`xtitle') legend(order(1 "GSA Bound: `qoi_lab' = `qoi_val'"))


end