[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