简体   繁体   中英

How do you create dynamic axis labels using ylab() in ggplot2?

I am making a series of plots in ggplot2, one per column of data, and I'd like to be able to code it so that the Y-axis label changes dynamically to the name of the plotted variable (and some other constant info in the label).

my data from dput() :

df <- structure(list(day = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), .Label = c("5-Aug", "10-Aug", "17-Aug"), class = "factor"), 
station = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L
), Bug = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 
1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 1L, 2L, 2L, 2L, 
3L, 3L, 3L), .Label = c("Copepod", "Copepod nauplii", "Harpactioid copepods"
), class = "factor"), Mean = c(382.4048896, 1017.171389, 
1519.141298, 233.3753491, 167.1086422, 530.7227507, 20.55943305, 
482.9992303, 10.49548997, 698.0193699, 5398.533995, 2458.635058, 
36.90431458, 124.4956045, 20.8459728, 8.414735929, 4014.649407, 
7.279486288, 346.1246378, 5722.82018, 6253.357325, 427.6856315, 
1768.984975, 1486.635443, 4.825526305, 46.50462845, 1.07692853
), StErr = c(83.18963396, 100.9187504, 73.45417607, 88.08491141, 
44.57580452, 44.03459391, 4.663586058, 112.4238952, 2.551982788, 
284.3933876, 3417.741042, 689.5558519, 9.798626545, 49.16103906, 
4.268815029, 3.76465482, 1803.977156, 1.328408258, 53.67873047, 
1796.827256, 732.573507, 86.56594682, 198.7842421, 229.0132055, 
1.129940095, 16.48065742, 0.283417726)), .Names = c("day", 
"station", "Bug", "Mean", "StErr"), row.names = c(NA, -27L), class = "data.frame")

I am using the following code to automatically create and save a new, dynamically named .pdf:

library(ggplot2)
df$day<-factor(df$day, levels = c("5-Aug","10-Aug","17-Aug")) #corrects day order

allplots <- ggplot(data=df, aes(x=station, y=Mean)) + 
    geom_errorbar(aes(ymin=(Mean-StErr), ymax=(Mean+StErr)), colour="black", width=0.1)+
    geom_point(size=2) + 
    xlab(NULL) +
    ylab(expression(paste('Copepods,'~'#/m'^3))) +
    theme_bw() +
    theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank()
    ) + 
    scale_x_continuous(expand=c(.3,0), breaks=c(1:3), labels=c("In", "FL", "Off")) +
    annotation_logticks(sides = "l") + 
    scale_y_log10() +
    theme(axis.text.x=element_text(size=12)) +
    theme(axis.text.y=element_text(size=12)) +
    facet_grid(Bug ~ day)

plotfun <- function(x,y) {
    a <- ggplot(data=x, aes(x=station, y=Mean)) +
        geom_errorbar(aes(ymin=(Mean-StErr), ymax=(Mean+StErr)), colour="black", width=0.1)+
        geom_point(size=2) + 
        xlab(NULL) +
        ylab(expression(paste('Copepods,'~'#/m'^3))) + #I'd like Copepods to change with variable that is being plotted
        theme_bw() +
        theme(
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank()
        ) + 
        scale_x_continuous(expand=c(.3,0), breaks=c(1:3), labels=c("In", "FL", "Off")) +
        annotation_logticks(sides = "l") + 
        scale_y_log10() +           
        theme(axis.text.x=element_text(size=12)) +
        theme(axis.text.y=element_text(size=12)) +              
        facet_grid(.~day)
 pdf(file=paste(y,'pdf',sep="."))
 print(a)
 dev.off()  
     }

mapply(plotfun, split(df, df$Bug), levels(df$Bug)) 

I tried using paste(levels(df$Bug)) within the ylab() but couldn't get it to work. I'm not sure what else to try, and was hoping someone would be able to suggest something I can look into. I would like each Y-axis to read " VariableName , per m^3" with the VariableName taken from the levels of Bug (ie Copepod, Copepod nauplii, and Harpacticoid copepods). Does anyone know how to do this? This seems really cool and useful if I can get it to work! Thanks for any suggestions.

I think I can help with the labeling of the ylab of the plots and that seems to be the core of your question. This produces three plots but I encountered various ggplot errors which ( don't understand at all well) and this required that I pull out a bunch of code relating to themes and scales . I later put it back in with a different ordering which seemed to make the ggplot machinery happy.

plotfun <- function(x,y) {
    a <- ggplot(data=x, aes(x=station, y=Mean)) +
        geom_errorbar(aes(ymin=(Mean-StErr), ymax=(Mean+StErr)), 
                      colour="black", width=0.1)+
        geom_point(size=2) + 
        xlab(NULL) +
        ylab(  bquote(.(y)~"#"/m^3) )+   
        scale_y_log10()+
        theme_bw()  
 pdf(file=paste(y,'pdf',sep="."))
 print(a)
 dev.off()  
     }

mapply(plotfun, x=split(df, df$Bug), y=levels(df$Bug))

By moving items around (in a manner driven by the error messages I successively got) and adding one +sign I was able to get this version to run:

plotfun <- function(x,y) {
    a <- ggplot(data=x, aes(x=station, y=Mean)) +
        geom_errorbar(aes(ymin=(Mean-StErr), ymax=(Mean+StErr)), colour="black", width=0.1)+
        geom_point(size=2) + 
        xlab(NULL) +
        ylab(bquote(.(y)*","*~"#"/m^3) )+  
        scale_y_log10() + annotation_logticks(sides = "l") + 
        theme_bw() +
        theme(  panel.grid.major = element_blank(),
        panel.grid.minor = element_blank()  )  +  facet_grid(.~day)
 pdf(file=paste(y,'pdf',sep="."))
 print(a)
 dev.off()  
     }

mapply(plotfun, x=split(df, df$Bug), y=levels(df$Bug))

I'll just post one page: 在此处输入图片说明

Also fixed the errors I was geting with the allplots version:

 allplots <- ggplot(data=df, aes(x=station, y=Mean)) + 
    geom_errorbar(aes(ymin=(Mean-StErr), ymax=(Mean+StErr)), colour="black", width=0.1)+
    geom_point(size=2) + 
    facet_grid(Bug ~ day) +
    xlab(NULL) +
    ylab(expression(Copepods *","* ~'#'/m^3)) +scale_x_continuous(expand=c(.3,0), breaks=c(1:3), labels=c("In", "FL", "Off")) +annotation_logticks(sides = "l") + scale_y_log10() +
    theme_bw() +
    theme(   panel.grid.major = element_blank(),
    panel.grid.minor = element_blank()     ) + 
    theme(axis.text.x=element_text(size=12)) +
    theme(axis.text.y=element_text(size=12))
print(allplots)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM