[R] ggplot2: how to combine position=stack and position=dodge in a single graph?
elena.schulz at gmx.net
Sat Oct 25 00:18:19 CEST 2008
thanks a lot for your quick answer.
> You should be able to replicate any dodging layout with facetting
You mean instead of facetting by years, facetting by months? I will try
this an see how the plot looks.
> shift the second layer across a bit
> with aes(x=as.numeric(CommitMont) + 0.5)).
I tried this, but it didn't work with my data. I think due to the fact
that I am quite new to R.
> please send me a reproducible example.
It took me a bit to create some reproducible example data that shows my
problem. Please see the example script below.
Wouldn't it be more intuitive to have some parameters for layers like
stacking=c(s1, s2, ...), dodging=c(d1, d2), ..., or is the combination
of both so rarely used?
Thanks a lot for your help to get it work with the below script.
Here is my script:
# create artificial timeseries data
n = 12*2*20 # number of values = 12 * nyears * npermonth
tser = newIts(start="2006-01-01",end="2007-12-31", period="month",
find="last", extract=TRUE, weekday=FALSE)
t = strptime(dates(tser), format="%Y-%m-%d")
CommitMonth = strftime(t, "%m")
CommitYear = strftime(t, "%Y")
n = 24*20 # number of values
Price = rnorm(1000, mean = 1000, sd = 500)[1:n]
newCust = as.logical(round(runif(n, min=0, max=1)))
c_dat = data.frame(cbind(CommitYear, CommitMonth, newCust), Price)
# use reshape for flexibility
c_datM = melt(c_dat,
id = c("CommitYear", "CommitMonth", "newCust"),
measured = c("Price"),
na.rm = TRUE)
nc_dat = cast(c_datM, CommitMonth + CommitYear + newCust ~ variable, sum)
# separate data for different years
nc_dat_06 = subset(nc_dat, CommitYear == 2006)
nc_dat_07 = subset(nc_dat, CommitYear == 2007)
# try to combine dodging and stacking
layer(data = nc_dat_07,
mapping = aes(x=CommitMonth,
fill = factor(newCust),
layer(data = nc_dat_06,
mapping = aes(x=factor(as.numeric(CommitMonth)+.5),
hadley wickham wrote:
> Hi Elena,
> You should be able to replicate any dodging layout with facetting, but
> you should be to shift the second layer across a bit with
> aes(x=as.numeric(CommitMont) + 0.5)). If that doesn't work, please
> send me a reproducible example.
> On Tue, Oct 21, 2008 at 3:59 PM, Elena Schulz <elena.schulz at gmx.net> wrote:
>> Hi Hadley,
>> my problem is that I want to compare data for different years month by
>> month. Each bar for a month is devided into two or more sections (->
>> stacking) By having all data of the same month right next to each other (->
>> dodging) comparision is much more easy than using faceting which does not
>> show subtle differences within the same month of different years since all
>> years get separated.
>> My approach to allow combining of stacking and dodging in a single
>> graphic would be the following:
>> # compare different years in one plot
>> # combine position_stack with position_dodge
>> ggplot() +
>> layer(data = nc_dat_06,
>> mapping = aes(x=CommitMonth,
>> fill = factor(newCust),
>> ) +
>> layer(data = nc_dat_07,
>> mapping = aes(x=CommitMonth,
>> This works except that the second layer (data = nc_dat_07) is plotted right
>> on top of the first one (data = nc_dat_06). If I could find a way to shift
>> the whole second layer (data = nc_dat_07) a bit parallel to the x axis, I'm
>> done. Is there an easy way for this? Adding an x-offset value to a layer?
>> Thanks for any help on this,
>> -- Elena
>> hadley wickham wrote:
>>> Hi Elena,
>>> Currently, there's no way to combine stacking and dodging in a single
>>> graphic. However, you can often use faceting to get a similar effect
>>> to dodging. Could you explain your problem in a little more detail?
>>> On Sat, Oct 4, 2008 at 4:22 PM, Elena Schulz <elena.schulz at gmx.net> wrote:
>>>> Hi ggplot experts,
>>>> I need to plot two time series of stacked data: a barchart with bars for
>>>> each month. To compare the data of two years I need to combine both time
>>>> series with in a single graph via position=doge.
>>>> How should I do that?
>>>> I tried the following scenario:
>>>> I added two layers with the time series of the stacked data for both
>>>> That worked well exept the bars are obscuring each other. How can I
>>>> one of the layers to get them displayed next to each other.
>>>> Is there an other easier way to achieve this?
>>>> Thanks a lot for any help on this.
>>>> -- Elena
>>>> R-help at r-project.org mailing list
>>>> PLEASE do read the posting guide
>>>> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help