Stata The Stata listserver
[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

st: Re: Graphing RAREA with two crossing functions


From   Friedrich Huebler <[email protected]>
To   [email protected]
Subject   st: Re: Graphing RAREA with two crossing functions
Date   Fri, 17 Oct 2003 08:23:59 -0700 (PDT)

--- Ernest Berkhout <[email protected]> wrote:
> The idea seems simple, the implementation that I tried so far
> appears to be not... Therefor I firstly report what I have managed
> to tackle myself, but finally there are still some open ends.
> Anyone out there who might have a clue?
> 
> The problem is as follows: imagine a twoway (overlayed) graph with
> two lines that cross eachother (maybe more than once), for example
> Y = sin(x) and Y2 = 0.2.
> Now I want to shade the closed areas between these two lines. If
> possible, I also want different colors for the two possibilities
> Y>Y2 and Y<Y2. My first approach was to copy minimum and maximum
> values and then use the -twoway rarea- approach.
> 
> ***********************************
> The example can be reproduced with:
> 
> set obs 100
> gen x = _n/10
> gen y = sin(x)
> gen y2=.2
> 
> *** create low/high-series for the areas where Y>Y2:
> gen low1  = y2 if y > y2
> gen high1 = y  if y > y2
> 
> *** create low/high-series for the areas where Y<Y2:
> gen low2  = y  if y < y2
> gen high2 = y2 if y < y2
> 
> twoway (line y x) (line y2 x ) (rarea low1 high1 x ) (rarea low2
> high2 x )
> ********************************
> 
> This yields two problems:
> 1. The shaded area of this graph does not extend until the
> exact points of intersection, especially when there are relatively
> few datapoints. The 'edges' of the area are left blank.
> 2. Follows from problem 1: although the variables low1 and high1
> are set to missing when the values of Y are below Y2 (low1>high1),
> there is still an area to plot for Stata, namely from the last
> non-missing observations to the first non-missing observations from
> the next area where Y>Y2 again.
> 
> I managed to work around most of the second problem, by setting
> low1 & high1 equal to either Y or Y2 instead of missing. Then the
> code reads:
> 
> gen low1  = y2 if y > y2
> gen high1 = y  if y > y2
> replace low1 = y2 if low1==.
> replace high1= y2 if high1==.
> 
> But when datapoints aren't many (or when functions aren't that
> smooth as in my example), problem 1 still leaves behind its marks.
> What is really needed is a way to adress the graph to fill the area
> up untill the intersection points (and not any further).
> Does anyone have a clue? Is it possible to adress the intersection
> in a continuous way, or does one manually has to compute these
> points and add them (temporarily) to the data? Any opinions are
> welcome!

Ernest,

As far as I know, you have to compute the missing values yourself.
The option -plotregion(margin(zero))- is also useful in this context.
The syntax below seems to do what you want. I changed the first two
commands and the last command.

set obs 101
gen x = _n/10 - 0.1
gen y = sin(x)
gen y2=.2

*** create low/high-series for the areas where Y>Y2:
gen low1  = y2 if y > y2
gen high1 = y  if y > y2
replace low1 = y2 if low1==.
replace high1= y2 if high1==.

*** create low/high-series for the areas where Y<Y2:
gen low2  = y  if y < y2
gen high2 = y2 if y < y2

twoway (line y x) (line y2 x ) (rarea low1 high1 x ) (rarea low2
high2 x ), plotregion(margin(zero))

Friedrich Huebler

__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com
*
*   For searches and help try:
*   http://www.stata.com/support/faqs/res/findit.html
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/



© Copyright 1996–2024 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   What's new   |   Site index