program define muxyplot
*! 1.2.0 NJC 16 June 1999
        version 6.0
        syntax varlist(min=4) [if] [in] [fweight aweight iweight] /*
        */ [ , L2title(str) BY(str) Need(str) Connect(str) Symbol(str) Link * ] 

        if "`link'" != "" & "`connect'" != "" {
                di in r "connect() may not be combined with link()"
                exit 198
        }

        tokenize `varlist'
	local nvars : word count `varlist'
        if mod(`nvars', 2) != 0 {
                di in r "need even number of variables"
                exit 198
        }
        local nvarsh = `nvars' / 2

        preserve
        tempvar id Y X Xmin pair

        gen `id' = _n

        if "`exp'" != "" {
                tempvar w
                gen `w' `exp'       /* `exp' might not be a variable */
                local exp "= `w'"
        }

        local i = 1
        local j = 1 + `nvarsh'
        while `i' <= `nvarsh' {
                local stargs "`stargs' ``i'' ``j'' `id' `w' `need'"
                local Ylab`i' : variable label ``i''
                if "`Ylab`i''" == "" { local Ylab`i' "``i''" }
                local Xlab`i' : variable label ``j''
                if "`Xlab`i''" == "" { local Xlab`i' "``i''" }
                local Ylist "`Ylist' ``i''"
                local Xlist "`Xlist' ``j''"
                local i = `i' + 1
                local j = `j' + 1
        }

        stack `stargs' `if' `in', into(`Y' `X' `id' `w' `need') wide clear

        local i = 1
        local j = 1 + `nvarsh'
        while `i' <= `nvarsh' {
                label var ``i'' "`Ylab`i''"
                label var ``j'' "`Xlab`i''"
                local i = `i' + 1
        }

        label var `X' "`Xlist'"
        if `"`l2title'"' == `""' { local l2title "`Ylist'" }
        if "`by'" != "" {
                sort `by'
                local byby "by(`by')"
        }
        if "`connect'" == "" { local connect : di _dup(`nvarsh') "." }
        if "`symbol'" == "" {
                local symbol = substr("opdOTS.",1,`nvarsh') + "i"
        }
        else { local symbol "`symbol'i" }

        qui if "`link'" == "link" {
                expand 2 if _stack > 1 & _stack < `nvarsh'
                egen `Xmin' = min(`X'), by(`id')
                replace `Xmin' = -`Xmin'
                sort `by' `Xmin' `id' _stack
                by `by' `Xmin' `id' : gen byte `pair' = int((_n + 1) / 2)
                sort `by' `Xmin' `id' `pair' `X'
                local connect "`connect'L"
        }

        gra `Ylist' `Y' `X' [`weight' `exp' ], /*
        */ `byby' s(`symbol') c(`connect') l2(`"`l2title'"') `options'
end