Pere
Pere

Reputation: 746

Scatter plot color by variable

I want to make an scatter plot in Stata with points colored according to a categorical variable.

The only way I've found to do this, is to code colors in layers of a twoway plot.

However, this seems a rather convoluted solution for such a simple operation:

twoway (scatter  latitud longitud if nougrups4 ==1, mcolor(black)) ///
       (scatter  latitud longitud if nougrups4 ==2, mcolor(blue))  ///
       (scatter  latitud longitud if nougrups4 ==3, mcolor(red))  ///
       (scatter  latitud longitud if nougrups4 ==4, mcolor(green))

Is there a simpler and automatic way to do this?

In this case, the categorical variable nougrups4 came from a cluster analysis. A general solution would be fine, but also a specific solution to draw clusters.

Upvotes: 2

Views: 18986

Answers (2)

dimitriy
dimitriy

Reputation: 9470

This is how I would do this by hand:

sysuse auto, clear

separate price, by(rep78)
tw scatter price? mpg
drop price? 

Or in one line using Nick Cox's sepscatter command from SSC:

sepscatter price mpg, separate(rep78)

The latter command can also output other type of plots with the recast() option.

Upvotes: 6

user8682794
user8682794

Reputation:

There isn't a 'simpler' built-in solution for what you want to do.

However, here's a simple wrapper command, which you can extend to meet your needs:

capture program drop foo
program define foo 

syntax varlist(min=1 max=3) 

quietly {
    tokenize `varlist'
    levelsof `3', local(foolevels) 

    local i = 0
    local foocolors red green blue

    foreach x of local foolevels {
        local ++i
        local extra `extra'  || scatter `1' `2' if `3' == `x', mcolor("`: word `i' of `foocolors''")
    }           
    twoway `extra' 
}
end

And a toy example:

clear
set obs 10

generate A = runiform()
generate B = runiform()
generate C = .

replace C = 1 in 1/3
replace C = 2 in 4/7
replace C = 3 in 8/10

foo A B C

Upvotes: 2

Related Questions