[R] ggplot2 shifting bars to only overlap in groups

Hörmetjan Yiltiz hyiltiz at gmail.com
Sat Feb 14 09:32:03 CET 2015


I think maybe it is possible to first produce a blank axis, and then
splitting the data frame by the value of *direction. *Then add the goem_bar
and goem_errorbar for the blank axis for the first split, then add them for
the second half split. This is actually a slit-apply-combine strategy. It
would be perfect if we could come up with the way to do that using
*d_ply().*

I see where you are at when you are saying geom_point. I have adjusted it a
bit so that the *direction* factor is also labeled out with *linetype*,
simply adding *linetype=direction* in the goem_errorbar function. One
problem for this is normally we use bar charts as a standard for this type
of statistics, and the comparison is visually more easier using bar charts
than the geom_point version.

A question about this, though. What determines the vertical axis value for
the points? I see they are layered so that they do not overlap although a
lot of dots share the same horizontal value: male. Is that handled utterly
by a mechanism that is not relevant with the data, but to produce less
clattered plot?

Thanks so much for your hlep! Here is the code I have tweaked based on
yours, adding the dashed line for direction:

dat1  <-  structure(list(gender = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L,
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L,
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("male", "female"
), class = "factor"), direction = structure(c(1L, 1L, 2L, 2L,
1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L,
1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("up",
"down"), class = "factor"), condition = structure(c(1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("c1",
"c2", "c3", "c4"), class = "factor"), location = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label =
c("east",
"west"), class = "factor"), t = c(1.78664348823968, 1.045971213672,
1.45271943418506, 1.52433880441405, 0.894240903766416, 1.04200421306615,
0.992602172725307, 1.35686661120166, 1.15664717132331, 1.78519605814623,
1.3131987417228, 1.23649081362245, 1.33657440193627, 1.39069933103098,
1.16990353110185, 1.50384132346169, 0.240063246756554, 0.151918103772423,
1.26918566082989, 1.44462610872269, 0.944676078996681, 0.945358342820427,
0.68274449456263, 0.983609699924918, 1.06442538569853, 0.917922814494952,
1.06681054493614, 0.899670881737641, 0.639091165646195, 1.81227533189609,
1.02711921654525, 2.05244515236416), ci = c(0.199453475099606,
0.0208699634619525, 0.0267762622040696, 0.0719683008799792,
0.0388022593655329,
0.0873965412159785, 0.0828671112758008, 0.556676454332325,
0.109726976194332,
0.237352334670391, 0.202173510668684, 0.104263016807603, 0.0174283081233597,
0.027601059580507, 0.118300511535772, 0.272210060810133, 0.210343075045509,
0.010793003362928, 0.241665829872765, 0.387877941848338, 0.230361471258575,
0.233088662079594, 0.0956745517473407, 0.187969512005399,
0.0041769632082831,
0.26242665290992, 0.297793257986101, 0.14520541873456, 0.123447338902161,
0.10109002280374, 0.332925731545975, 0.434868806611465)), .Names =
c("gender",
"direction", "condition", "location", "t", "ci"), row.names = c(NA,
-32L), class = "data.frame")


dat1$jit <- ifelse( dat1$gender == "male",  1,
        ifelse( dat1$gender == 'female',  2,
          NA) )
dat1$jit  <-  as.numeric(dat1$jit)

dat1$jit  <-  jitter(dat1$jit)

x  <-  "male"
y  <-  "female"############Begin code ##############
ab <-  ggplot(dat1, aes (jit, t)) +
       geom_point(aes(colour = condition)) +
        theme(axis.ticks = element_blank()) +
        scale_x_continuous(breaks=c(1, 2),
                           labels=c("male", "female"),
                           name="Gender")
ab


bb  <-  ab + facet_grid(location~.)
bb

bc  <-  bb +
    geom_errorbar(data = dat1, aes(ymin=t-ci, ymax=t+ci,
                colour = condition,
                linetype = direction),
                  width=.2 )
bc


cf  <-  bc + coord_flip()
cf

############End code ###############


祝好,
========================
He who is worthy to receive his days and nights is worthy to receive* all
else* from you (and me).
                                                 The Prophet, Gibran Kahlil


On Sat, Feb 14, 2015 at 1:41 AM, John Kane <jrkrideau at inbox.com> wrote:

> Both files came through.  The R-help list is picky. For example it will
> accept cat.txt but not cat.csv.
>
> Now I see what you are after. and I must admit I haven't a clue at the
> moment. I suspect others who know more about ggplot can help.  If not there
> is ggplot2 Google Groups that has a lot of knowledge and you might want to
> post there.  It accepts all kinds of file types. :)
>
> On the other hand, I don't like dynamite plots (what you have) and
> wondered if it was possible to do something with geom_point() instead.
>
> It was, in a bit of a half-assed way so I'll pass on my raw code. It's
> ulgy but works. I don't know if I'd call it pub-quality but perhaps it can
> be tweaked (wrenched? , bludgened?) into something acceptable.
>
> BTW, I changed your data.frame name to dat1.  df is an R function.  Type
> df and you will see what I mean. I've also converted the data to a dput()
> file. Not needed as you supplied a perfectly good data set but generally
> good practice.
>
> Sorry I was not able to be of more help
>
> John Kane
> Kingston ON Canada
>
> ############Begin code ##############
> library(ggplot2)
> library(scales)
> dat1  <-  structure(list(gender = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L,
> 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L,
> 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("male", "female"
> ), class = "factor"), direction = structure(c(1L, 1L, 2L, 2L,
> 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L,
> 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("up",
> "down"), class = "factor"), condition = structure(c(1L, 1L, 1L,
> 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L,
> 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("c1",
> "c2", "c3", "c4"), class = "factor"), location = structure(c(1L,
> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L,
> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label =
> c("east",
> "west"), class = "factor"), t = c(1.78664348823968, 1.045971213672,
> 1.45271943418506, 1.52433880441405, 0.894240903766416, 1.04200421306615,
> 0.992602172725307, 1.35686661120166, 1.15664717132331, 1.78519605814623,
> 1.3131987417228, 1.23649081362245, 1.33657440193627, 1.39069933103098,
> 1.16990353110185, 1.50384132346169, 0.240063246756554, 0.151918103772423,
> 1.26918566082989, 1.44462610872269, 0.944676078996681, 0.945358342820427,
> 0.68274449456263, 0.983609699924918, 1.06442538569853, 0.917922814494952,
> 1.06681054493614, 0.899670881737641, 0.639091165646195, 1.81227533189609,
> 1.02711921654525, 2.05244515236416), ci = c(0.199453475099606,
> 0.0208699634619525, 0.0267762622040696, 0.0719683008799792,
> 0.0388022593655329,
> 0.0873965412159785, 0.0828671112758008, 0.556676454332325,
> 0.109726976194332,
> 0.237352334670391, 0.202173510668684, 0.104263016807603,
> 0.0174283081233597,
> 0.027601059580507, 0.118300511535772, 0.272210060810133, 0.210343075045509,
> 0.010793003362928, 0.241665829872765, 0.387877941848338, 0.230361471258575,
> 0.233088662079594, 0.0956745517473407, 0.187969512005399,
> 0.0041769632082831,
> 0.26242665290992, 0.297793257986101, 0.14520541873456, 0.123447338902161,
> 0.10109002280374, 0.332925731545975, 0.434868806611465)), .Names =
> c("gender",
> "direction", "condition", "location", "t", "ci"), row.names = c(NA,
> -32L), class = "data.frame")
>
>
> dat1$jit <- ifelse( dat1$gender == "male",  1,
>         ifelse( dat1$gender == 'female',  2,
>           NA) )
> dat1$jit  <-  as.numeric(dat1$jit)
>
> dat1$jit  <-  jitter(dat1$jit)
>
> x  <-  "male"
> y  <-  "female"############Begin code ##############
> ab <-  ggplot(dat1, aes (jit, t)) +
>        geom_point(aes(colour = condition)) +
>         theme(axis.ticks = element_blank()) +
>         scale_x_continuous(breaks=c(1, 2),
>                            labels=c("male", "female"),
>                            name="Gender")
> ab
>
>
> bb  <-  ab + facet_grid(location~.)
> bb
>
> bc  <-  bb +
>     geom_errorbar(data = dat1, aes(ymin=t-ci, ymax=t+ci,
>                 colour = condition),
>                   width=.2 )
> bc
>
>
> cf  <-  bc + coord_flip()
> cf
>
> ############End code ###############
>
>
> John Kane
> Kingston ON Canada
>
> -----Original Message-----
> From: hyiltiz at gmail.com
> Sent: Fri, 13 Feb 2015 02:28:17 +0800
> To: jrkrideau at inbox.com
> Subject: Re: [R] ggplot2 shifting bars to only overlap in groups
>
> I did not know the SVG file did not come through. I thought SVG should be
> able to pass through the filter. Here is a PDF file along with an PNG.
> Guess one of them should be able to pass.
>
> 祝好,
> ========================
> He who is worthy to receive his days and nights is worthy to receive* all
> else* from you (and me).
>                                                  The Prophet, Gibran Kahlil
>
> On Fri, Feb 13, 2015 at 12:04 AM, John Kane <jrkrideau at inbox.com> wrote:
>
>  I'm a bit blind today. I read df as a dput() .
>
>  John Kane
>  Kingston ON Canada
>
>  -----Original Message-----
>  From: hyiltiz at gmail.com
>  Sent: Thu, 12 Feb 2015 23:38:01 +0800
>  To: jrkrideau at inbox.com
>  Subject: Re: [R] ggplot2 shifting bars to only overlap in groups
>
>  You are most likely simply not running the whole lines of code: note that
> the first line is:
>
>  N = 32
>
>   Best
>>  ========================
>  He who is worthy to receive his days and nights is worthy to receive* all
>  else* from you (and me).
>                                                   The Prophet, Gibran
> Kahlil
>
>  On Thu, Feb 12, 2015 at 11:31 PM, John Kane <jrkrideau at inbox.com> wrote:
>
>          I am gettting the error"
>   Error in rep_len(rep.int [http://rep.int] [http://rep.int [
> http://rep.int]](seq_len(n), rep.int [http://rep.int] [http://rep.int [
> http://rep.int]](k, n)), length) :
>
>    object 'N' not found
>
>   Also your image did not come through.  Try sending it as a pdf file.
>
>   when I try to create
>   df<- data.frame(gender=gl(2,1,N, c("male","female")),
>             direction=gl(2,2,N, c("up","down")),
>             condition=gl(4,4,N, c("c1","c2","c3","c4")),
>             location=gl(2,16,N, c("east","west")),
>             t=rnorm(N, 1, 0.5),
>             ci=abs(rnorm(N, 0, 0.2)))
>
>   John Kane
>   Kingston ON Canada
>
>   > -----Original Message-----
>   > From: hyiltiz at gmail.com
>   > Sent: Thu, 12 Feb 2015 22:08:36 +0800
>   > To: r-help at r-project.org
>   > Subject: [R] ggplot2 shifting bars to only overlap in groups
>   >
>   > Hi all,
>   >
>   > I have four factors for a continuous time variable along with its
>   > confidence interval. I would like to produce a publication quality
> error
>   > bar chart that is clear to understand. For now, I used colors, x axis
>   > position, facets and alpha level to distinguish them.
>   >
>   > I would like to overlap each pairs of bars with the same color a bit
> as a
>   > group, but not overlap each and every bars with each other.
>   >
>   > Here is a minimal example:
>   >
>   > N = 32
>   > df<- data.frame(gender=gl(2,1,N, c("male","female")),
>   >           direction=gl(2,2,N, c("up","down")),
>   >           condition=gl(4,4,N, c("c1","c2","c3","c4")),
>   >           location=gl(2,16,N, c("east","west")),
>   >           t=rnorm(N, 1, 0.5),
>   >           ci=abs(rnorm(N, 0, 0.2)))
>   > pp <-
>   >   ggplot(df, aes(x=gender, y=t, fill=condition, alpha=direction)) +
>   >   facet_grid(location~.) +
>   >   geom_bar(position=position_dodge(.9), stat="identity",
> color="black") +
>   >   geom_errorbar(aes(ymin=t-ci, ymax=t+ci),
>   >                 width=.2,                    # Width of the error bars
>   >                 position=position_dodge(.9)) +
>   >   scale_alpha_discrete(range= c(0.4, 1))
>   > pp
>   >
>   >
>   >
>   > In the attachment, I have added the output figure, while manually
> editing
>   > the SVG file to make the lower-left group of bars to make them as I
>   > wanted.
>   > (The spacing in between each pair is not necessarily required.)
>   >
>   >
>   > Best
>   > ,
>   > ========================
>   > He who is worthy to receive his days and nights is worthy to receive*
> all
>   > else* from you (and me).
>   >                                                  The Prophet, Gibran
>   > Kahlil
>
>  > ______________________________________________
>   > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>
>  > https://stat.ethz.ch/mailman/listinfo/r-help [
> https://stat.ethz.ch/mailman/listinfo/r-help] [
> https://stat.ethz.ch/mailman/listinfo/r-help [
> https://stat.ethz.ch/mailman/listinfo/r-help]]
>   > PLEASE do read the posting guide
>   > http://www.R-project.org/posting-guide.html [
> http://www.R-project.org/posting-guide.html] [
> http://www.R-project.org/posting-guide.html [
> http://www.R-project.org/posting-guide.html]]
>   > and provide commented, minimal, self-contained, reproducible code.
>
>   ____________________________________________________________
>   Can't remember your password? Do you need a strong and secure password?
>   Use Password manager! It stores your passwords & protects your account.
>   Check it out at http://mysecurelogon.com/password-manager [
> http://mysecurelogon.com/password-manager] [
> http://mysecurelogon.com/password-manager [
> http://mysecurelogon.com/password-manager]]
>
>  ____________________________________________________________
>  FREE ONLINE PHOTOSHARING - Share your photos online with your friends and
> family!
>  Visit http://www.inbox.com/photosharing [
> http://www.inbox.com/photosharing] to find out more!
>
> ____________________________________________________________
> Can't remember your password? Do you need a strong and secure password?
> Use Password manager! It stores your passwords & protects your account.
> Check it out at http://mysecurelogon.com/manager
>
>
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list