Quantcast

barplot question

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

barplot question

Michael Eisenring
 Dear r-help members.

I would like to:

a) control the margin around my legend box. Unfortunately I did not find an appropriate command under "?legend". The margin around the actual legend is way too wide. There is a lot of unnecessary "empty space" on the right side.

b) increase the width of the individual barplots. I saw that this can be obtained with the command "width" and "xlim".However, since I have 3 Barplots next to each other "beside=T", I could not figure it out how to do it (2 Barplots are disappearing)

c) I wanted to label each bar ("names.arg") unfortunately nothing happens if I use this command (in my code i just used 1:10 for the names, in the original plot I would replace the numbers with real names)

Thank you very much:

Input data (dput)

structure(list(total = c(28L, 17L, 11L, 6L, 6L, 5L, 4L, 3L, 3L,
2L), young = c(29L, 22L, 15L, 8L, 5L, 3L, 2L, 2L, 2L, 2L), old = c(36L,
11L, 11L, 8L, 6L, 5L, 4L, 3L, 2L, 2L)), .Names = c("total", "young",
"old"), class = "data.frame", row.names = c(NA, -10L))




R-code:
barplot(as.matrix(plants_herbs_input_top10),xaxt="n",
        space=c(0.5,12),ylab= "Relative frequencies (%)",beside=TRUE,
        col=c(rep("black",10),rep("chartreuse1",10),rep("chartreuse4",10)),ylim=c(0,50),cex.names=0.8,names.arg=c("1", "2", "3","4","5","6","7","8","9","10","1", "2", "3","4","5","6","7","8","9","10","1", "2", "3","4","5","6","7","8","9","10"))
        legend("topright",c("Total","Young secondary forest","Old secondary forest"),cex=0.9,pt.cex=1,y.intersp=0.4,pch=15,col=c("black","chartreuse1","chartreuse4"))


        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: barplot question

Rui Barradas
Hello,

Try the following.


plants_herbs_input_top10 <- structure(list(total = c(28L, 17L, 11L, 6L,
6L, 5L, 4L, 3L, 3L,
2L), young = c(29L, 22L, 15L, 8L, 5L, 3L, 2L, 2L, 2L, 2L), old = c(36L,
11L, 11L, 8L, 6L, 5L, 4L, 3L, 2L, 2L)), .Names = c("total", "young",
"old"), class = "data.frame", row.names = c(NA, -10L))

# Keep the return value, we'll need it later
# to know where to place the bars names
bp <- barplot(data.matrix(plants_herbs_input_top10),
     width = 1,
     ylim = c(0,50),
     xaxt = "n",
       space = c(0.2, 1.0),   #------> this has changed
     ylab = "Relative frequencies (%)",
     beside = TRUE,
       col = rep(c("black", "chartreuse1", "chartreuse4"), each=10),
     cex.names = 0.8)       #------> this has changed
#------> line below commented out
#    names.arg = rep(as.character(1), 3))
text(as.vector(bp), y = -1, labels = rep(1:10, 3), xpd = TRUE)

legend.width <- max(strwidth(c("Total", "Young secondary forest","Old
secondary forest")))

legend("topright",
     c("Total", "Young secondary forest","Old secondary forest"),
     cex=0.9, pt.cex=1, pch=15, y.intersp=0.8,
     text.width = legend.width/2,      #------> this was added
     col=c("black","chartreuse1","chartreuse4"))


Hope this helps,

Rui Barradas

Em 30-07-2012 11:46, Michael Eisenring escreveu:

>   Dear r-help members.
>
> I would like to:
>
> a) control the margin around my legend box. Unfortunately I did not find an appropriate command under "?legend". The margin around the actual legend is way too wide. There is a lot of unnecessary "empty space" on the right side.
>
> b) increase the width of the individual barplots. I saw that this can be obtained with the command "width" and "xlim".However, since I have 3 Barplots next to each other "beside=T", I could not figure it out how to do it (2 Barplots are disappearing)
>
> c) I wanted to label each bar ("names.arg") unfortunately nothing happens if I use this command (in my code i just used 1:10 for the names, in the original plot I would replace the numbers with real names)
>
> Thank you very much:
>
> Input data (dput)
>
> structure(list(total = c(28L, 17L, 11L, 6L, 6L, 5L, 4L, 3L, 3L,
> 2L), young = c(29L, 22L, 15L, 8L, 5L, 3L, 2L, 2L, 2L, 2L), old = c(36L,
> 11L, 11L, 8L, 6L, 5L, 4L, 3L, 2L, 2L)), .Names = c("total", "young",
> "old"), class = "data.frame", row.names = c(NA, -10L))
>
>
>
>
> R-code:
> barplot(as.matrix(plants_herbs_input_top10),xaxt="n",
>          space=c(0.5,12),ylab= "Relative frequencies (%)",beside=TRUE,
>          col=c(rep("black",10),rep("chartreuse1",10),rep("chartreuse4",10)),ylim=c(0,50),cex.names=0.8,names.arg=c("1", "2", "3","4","5","6","7","8","9","10","1", "2", "3","4","5","6","7","8","9","10","1", "2", "3","4","5","6","7","8","9","10"))
>          legend("topright",c("Total","Young secondary forest","Old secondary forest"),cex=0.9,pt.cex=1,y.intersp=0.4,pch=15,col=c("black","chartreuse1","chartreuse4"))
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: barplot question

Rui Barradas
Hello,

Ok, final retouches.

1. Divide the par() call:

oldpar <- par(mar=c(9, 4.1, 4.1, 2.1))
oldfont <- par(font=3)

Then, just before legend()

par(oldfont)   # back to normal font

2. Modify the text() call to

text(as.vector(bp), y = -6.5, cex=0.7,
     pos = 2,
     offset = -0.25,
     ...etc...

(See the meaning in the help page for text().)

I think this does it. Good luck.

Rui Barradas

Em 31-07-2012 09:43, Michael Eisenring escreveu:

> Hi,
> thank you very much, looks awesome!
> I changed a few minor things. Right now I have a some last questions (i sent them also to R help)
>
> 1: I changed the font style of the plant names (along x-axis, under the bars)  to "italic" . How can I avoid that the font in the legend also changes to "italic"?
> 2. I would like to place the plant names (along x-axis, under the bars) in a way that :
> a) the first plant name is under the first bar (now the first name is too much to the right). If I change the x value under "text" all names are shifted to this one x-coordinate.
> b)the plant names should start all on the same "height" (e.g. all exactly on y=-6.5. Now they are misplaced
>
> Any ideas?
>
> Thank you very much
> Michi
>
>
> input data (dput):
>
> structure(list(total = c(28L, 17L, 11L, 6L, 6L, 5L, 4L, 3L, 3L,
> 2L), young = c(29L, 22L, 15L, 8L, 5L, 3L, 2L, 2L, 2L, 2L), old = c(36L,
> 11L, 11L, 8L, 6L, 5L, 4L, 3L, 2L, 2L)), .Names = c("total", "young",
> "old"), class = "data.frame", row.names = c(NA, -10L))
>
>
>
> R: Code
> plants_herbs_input_top10 <- structure(list(total = c(28L, 17L, 11L, 6L, 6L, 5L, 4L, 3L, 3L,
>                                                       2L), young = c(29L, 22L, 15L, 8L, 5L, 3L, 2L, 2L, 2L, 2L), old = c(36L,
>                                                                                                                          11L, 11L, 8L, 6L, 5L, 4L, 3L, 2L, 2L)), .Names = c("total", "young",
>                                                                                                                                                                             "old"), class = "data.frame", row.names = c(NA, -10L))
>
> # Keep the return value, we'll need it later
> # to know where to place the bars names
> bp <- barplot(data.matrix(plants_herbs_input_top10),
>                width = 1,
>                ylim = c(0,50),
>                xaxt = "n",
>                space = c(0.2, 1.0),
>                ylab = "Relative frequencies (%)",
>                beside = TRUE,
>                col = rep(c("black", "chartreuse1", "chartreuse4"), each=10),
>                cex.names = 0.8)
> par(mar=c(9, 4.1, 4.1, 2.1),font=3)
>
> #    names.arg = rep(as.character(1), 3))
> text(as.vector(bp),y=-6.5, cex=0.7,labels = c("Oplismenus sp.","Isachne mauritiana","Piper capense","Asplenium aethiopicum","Psychotria sp (seedlings)","Elatostema monticolum","Landolphia buchananii","Blotiella sp.","Asplenium elliottii","Hypoestes triflora","Isachne mauritiana","Oplismenus sp","Piper capense","Landolphia buchananii","Asplenium aethiopicum","Blotiella sp.","Carex chlorosaccus","Asplenium elliottii","Asplenium friesiorum","Polystichum sp.","Oplismenus sp","Psychotria sp (seedlings)","Elatostema monticolum","Asplenium aethiopicum","Hypoestes triflora","Piper capense","Asplenium elliottii","Blotiella sp.","Isoglossa substrobilina","Polystichum sp."),srt = 50,xpd = TRUE)
>
> legend.width <- max(strwidth(c("Total", "Young secondary forest","Old secondary forest")))
>
> legend(23,54,
>         c("Total", "Young secondary forest","Old secondary forest"),
>         cex=1, pt.cex=1.7, pch=15, y.intersp=0.4,bty="n",
>         text.width = legend.width/2.5,      #------> legendbox : text ratio
>         col=c("black","chartreuse1","chartreuse4"))
>
>
>
>
>

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Loading...