Question: ggsave option for ggbio Tracks function
0
gravatar for Mark Dunning
6.7 years ago by
Mark Dunning1.1k
Sheffield, Uk
Mark Dunning1.1k wrote:
Hi, I was just wondering if there was an option to save a 'Tracks' object to disk using a ggsave-like command? > p<- tracks(p.ideo, Gene = p1,Probes=p2,main=gene,heights=c(1,5,3)) > ggsave(p,file="tracks.png") Error in ggsave(p, file = "tracks.png") : plot should be a ggplot2 plot Regards, Mark
• 1.2k views
ADD COMMENTlink modified 3.4 years ago by kevin.rue220 • written 6.7 years ago by Mark Dunning1.1k
Answer: ggsave option for ggbio Tracks function
0
gravatar for Tengfei Yin
6.7 years ago by
Tengfei Yin420
Tengfei Yin420 wrote:
Hi Mark, This is a very good suggestion, you are right, ggsave doesn't work for tracks object now, and that's very annoying. For now, you can simply remove the check command(first two lines) in ggsave() and make sure any object could be saved, that works, if you pass a tracks object in the function. But won't work if you simply run ggsave without tracks name, because by default, last_plot() only capture single plot. Below is a sample code, you can run it and use it just for now, I am thinking about implementing in a more general way in ggbio devel and will let you know later . ggbiosave <- function (filename = default_name(plot), plot = last_plot(), device = default_device(filename), path = NULL, scale = 1, width = par("din")[1], height = par("din")[2], units = c("in", "cm", "mm"), dpi = 300, limitsize = TRUE, ...) { ## simply comment out the check part ## if (!inherits(plot, "ggplot")) ## stop("plot should be a ggplot2 plot") eps <- ps <- function(..., width, height) grDevices::postscript(..., width = width, height = height, onefile = FALSE, horizontal = FALSE, paper = "special") tex <- function(..., width, height) grDevices::pictex(..., width = width, height = height) pdf <- function(..., version = "1.4") grDevices::pdf(..., version = version) svg <- function(...) grDevices::svg(...) wmf <- function(..., width, height) grDevices::win.metafile(..., width = width, height = height) emf <- function(..., width, height) grDevices::win.metafile(..., width = width, height = height) png <- function(..., width, height) grDevices::png(..., width = width, height = height, res = dpi, units = "in") jpg <- jpeg <- function(..., width, height) grDevices::jpeg(..., width = width, height = height, res = dpi, units = "in") bmp <- function(..., width, height) grDevices::bmp(..., width = width, height = height, res = dpi, units = "in") tiff <- function(..., width, height) grDevices::tiff(..., width = width, height = height, res = dpi, units = "in") default_name <- function(plot) { paste(digest.ggplot(plot), ".pdf", sep = "") } default_device <- function(filename) { pieces <- strsplit(filename, "\\.")[[1]] ext <- tolower(pieces[length(pieces)]) match.fun(ext) } units <- match.arg(units) convert_to_inches <- function(x, units) { x <- switch(units, `in` = x, cm = x/2.54, mm = x/2.54/10) } convert_from_inches <- function(x, units) { x <- switch(units, `in` = x, cm = x * 2.54, mm = x * 2.54 * 10) } if (!missing(width)) { width <- convert_to_inches(width, units) } if (!missing(height)) { height <- convert_to_inches(height, units) } if (missing(width) || missing(height)) { message("Saving ", prettyNum(convert_from_inches(width * scale, units), digits = 3), " x ", prettyNum(convert_from_inches(height * scale, units), digits = 3), " ", units, " image") } width <- width * scale height <- height * scale if (limitsize && (width >= 50 || height >= 50)) { stop("Dimensions exceed 50 inches (height and width are specified in inches/cm/mm, not pixels).", " If you are sure you want these dimensions, use 'limitsize=FALSE'.") } if (!is.null(path)) { filename <- file.path(path, filename) } device(file = filename, width = width, height = height, ...) on.exit(capture.output(dev.off())) print(plot) invisible() } Thanks Tengfei On Thu, Jan 10, 2013 at 8:22 AM, Mark Dunning <mark.dunning@gmail.com>wrote: > Hi, > > I was just wondering if there was an option to save a 'Tracks' object > to disk using a ggsave-like command? > > > p<- tracks(p.ideo, Gene = p1,Probes=p2,main=gene,heights=c(1,5,3)) > > ggsave(p,file="tracks.png") > Error in ggsave(p, file = "tracks.png") : plot should be a ggplot2 plot > > Regards, > > Mark > > _______________________________________________ > Bioconductor mailing list > Bioconductor@r-project.org > https://stat.ethz.ch/mailman/listinfo/bioconductor > Search the archives: > http://news.gmane.org/gmane.science.biology.informatics.conductor > -- Tengfei Yin MCDB PhD student 1620 Howe Hall, 2274, Iowa State University Ames, IA,50011-2274 [[alternative HTML version deleted]]
ADD COMMENTlink written 6.7 years ago by Tengfei Yin420
a little more update, in the svn, I commit the change to override ggsave to let it support ggplot and Tracks object, also I let tracks has the ability to set itself as last plot too, so in next release, the ggsave function should work seamless for tracks or ggbio's plots. Tengfei On Thu, Jan 10, 2013 at 11:28 AM, Tengfei Yin <yintengfei@gmail.com> wrote: > Hi Mark, > > This is a very good suggestion, you are right, ggsave doesn't work for > tracks object now, and that's very annoying. > > For now, you can simply remove the check command(first two lines) in > ggsave() and make sure any object could be saved, that works, if you pass a > tracks object in the function. But won't work if you simply run ggsave > without tracks name, because by default, last_plot() only capture single > plot. Below is a sample code, you can run it and use it just for now, I am > thinking about implementing in a more general way in ggbio devel and will > let you know later . > > > ggbiosave <- function (filename = default_name(plot), plot = last_plot(), > device = default_device(filename), path = NULL, > scale = 1, > width = par("din")[1], height = par("din")[2], > units = c("in", > > "cm", "mm"), dpi = 300, limitsize = TRUE, ...) > { > ## simply comment out the check part > ## if (!inherits(plot, "ggplot")) > ## stop("plot should be a ggplot2 plot") > eps <- ps <- function(..., width, height) grDevices::postscript(..., > width = width, height = height, onefile = FALSE, horizontal = > FALSE, > paper = "special") > tex <- function(..., width, height) grDevices::pictex(..., > width = width, height = height) > pdf <- function(..., version = "1.4") grDevices::pdf(..., > version = version) > svg <- function(...) grDevices::svg(...) > wmf <- function(..., width, height) grDevices::win.metafile(..., > width = width, height = height) > emf <- function(..., width, height) grDevices::win.metafile(..., > width = width, height = height) > png <- function(..., width, height) grDevices::png(..., width = width, > height = height, res = dpi, units = "in") > jpg <- jpeg <- function(..., width, height) grDevices::jpeg(..., > width = width, height = height, res = dpi, units = "in") > bmp <- function(..., width, height) grDevices::bmp(..., width = width, > height = height, res = dpi, units = "in") > tiff <- function(..., width, height) grDevices::tiff(..., > width = width, height = height, res = dpi, units = "in") > default_name <- function(plot) { > paste(digest.ggplot(plot), ".pdf", sep = "") > } > default_device <- function(filename) { > pieces <- strsplit(filename, "\\.")[[1]] > ext <- tolower(pieces[length(pieces)]) > match.fun(ext) > } > units <- match.arg(units) > convert_to_inches <- function(x, units) { > x <- switch(units, `in` = x, cm = x/2.54, mm = x/2.54/10) > } > convert_from_inches <- function(x, units) { > x <- switch(units, `in` = x, cm = x * 2.54, mm = x * > 2.54 * 10) > } > if (!missing(width)) { > width <- convert_to_inches(width, units) > } > if (!missing(height)) { > height <- convert_to_inches(height, units) > } > if (missing(width) || missing(height)) { > message("Saving ", prettyNum(convert_from_inches(width * > scale, units), digits = 3), " x ", > prettyNum(convert_from_inches(height * > scale, units), digits = 3), " ", units, " image") > } > width <- width * scale > height <- height * scale > if (limitsize && (width >= 50 || height >= 50)) { > stop("Dimensions exceed 50 inches (height and width are specified > in inches/cm/mm, not pixels).", > " If you are sure you want these dimensions, use > 'limitsize=FALSE'.") > } > if (!is.null(path)) { > filename <- file.path(path, filename) > } > device(file = filename, width = width, height = height, ...) > on.exit(capture.output(dev.off())) > print(plot) > invisible() > } > > Thanks > > Tengfei > > > On Thu, Jan 10, 2013 at 8:22 AM, Mark Dunning <mark.dunning@gmail.com>wrote: > >> Hi, >> >> I was just wondering if there was an option to save a 'Tracks' object >> to disk using a ggsave-like command? >> >> > p<- tracks(p.ideo, Gene = p1,Probes=p2,main=gene,heights=c(1,5,3)) >> > ggsave(p,file="tracks.png") >> Error in ggsave(p, file = "tracks.png") : plot should be a ggplot2 plot >> >> Regards, >> >> Mark >> >> _______________________________________________ >> Bioconductor mailing list >> Bioconductor@r-project.org >> https://stat.ethz.ch/mailman/listinfo/bioconductor >> Search the archives: >> http://news.gmane.org/gmane.science.biology.informatics.conductor >> > > > > -- > Tengfei Yin > MCDB PhD student > 1620 Howe Hall, 2274, > Iowa State University > Ames, IA,50011-2274 > > > -- Tengfei Yin MCDB PhD student 1620 Howe Hall, 2274, Iowa State University Ames, IA,50011-2274 [[alternative HTML version deleted]]
ADD REPLYlink written 6.7 years ago by Tengfei Yin420
Hi Tengfei, Many thanks for your quick and helpful response. That does exactly what I want. Mark On Thu, Jan 10, 2013 at 9:44 PM, Tengfei Yin <yintengfei at="" gmail.com=""> wrote: > a little more update, in the svn, I commit the change to override ggsave to > let it support ggplot and Tracks object, also I let tracks has the ability > to set itself as last plot too, so in next release, the ggsave function > should work seamless for tracks or ggbio's plots. > > Tengfei > > > On Thu, Jan 10, 2013 at 11:28 AM, Tengfei Yin <yintengfei at="" gmail.com=""> wrote: >> >> Hi Mark, >> >> This is a very good suggestion, you are right, ggsave doesn't work for >> tracks object now, and that's very annoying. >> >> For now, you can simply remove the check command(first two lines) in >> ggsave() and make sure any object could be saved, that works, if you pass a >> tracks object in the function. But won't work if you simply run ggsave >> without tracks name, because by default, last_plot() only capture single >> plot. Below is a sample code, you can run it and use it just for now, I am >> thinking about implementing in a more general way in ggbio devel and will >> let you know later . >> >> >> ggbiosave <- function (filename = default_name(plot), plot = last_plot(), >> device = default_device(filename), path = NULL, >> scale = 1, >> width = par("din")[1], height = par("din")[2], >> units = c("in", >> >> "cm", "mm"), dpi = 300, limitsize = TRUE, ...) >> { >> ## simply comment out the check part >> ## if (!inherits(plot, "ggplot")) >> ## stop("plot should be a ggplot2 plot") >> eps <- ps <- function(..., width, height) grDevices::postscript(..., >> width = width, height = height, onefile = FALSE, horizontal = >> FALSE, >> paper = "special") >> tex <- function(..., width, height) grDevices::pictex(..., >> width = width, height = height) >> pdf <- function(..., version = "1.4") grDevices::pdf(..., >> version = version) >> svg <- function(...) grDevices::svg(...) >> wmf <- function(..., width, height) grDevices::win.metafile(..., >> width = width, height = height) >> emf <- function(..., width, height) grDevices::win.metafile(..., >> width = width, height = height) >> png <- function(..., width, height) grDevices::png(..., width = width, >> height = height, res = dpi, units = "in") >> jpg <- jpeg <- function(..., width, height) grDevices::jpeg(..., >> width = width, height = height, res = dpi, units = "in") >> bmp <- function(..., width, height) grDevices::bmp(..., width = width, >> height = height, res = dpi, units = "in") >> tiff <- function(..., width, height) grDevices::tiff(..., >> width = width, height = height, res = dpi, units = "in") >> default_name <- function(plot) { >> paste(digest.ggplot(plot), ".pdf", sep = "") >> } >> default_device <- function(filename) { >> pieces <- strsplit(filename, "\\.")[[1]] >> ext <- tolower(pieces[length(pieces)]) >> match.fun(ext) >> } >> units <- match.arg(units) >> convert_to_inches <- function(x, units) { >> x <- switch(units, `in` = x, cm = x/2.54, mm = x/2.54/10) >> } >> convert_from_inches <- function(x, units) { >> x <- switch(units, `in` = x, cm = x * 2.54, mm = x * >> 2.54 * 10) >> } >> if (!missing(width)) { >> width <- convert_to_inches(width, units) >> } >> if (!missing(height)) { >> height <- convert_to_inches(height, units) >> } >> if (missing(width) || missing(height)) { >> message("Saving ", prettyNum(convert_from_inches(width * >> scale, units), digits = 3), " x ", >> prettyNum(convert_from_inches(height * >> scale, units), digits = 3), " ", units, " image") >> } >> width <- width * scale >> height <- height * scale >> if (limitsize && (width >= 50 || height >= 50)) { >> stop("Dimensions exceed 50 inches (height and width are specified >> in inches/cm/mm, not pixels).", >> " If you are sure you want these dimensions, use >> 'limitsize=FALSE'.") >> } >> if (!is.null(path)) { >> filename <- file.path(path, filename) >> } >> device(file = filename, width = width, height = height, ...) >> on.exit(capture.output(dev.off())) >> print(plot) >> invisible() >> } >> >> Thanks >> >> Tengfei >> >> >> On Thu, Jan 10, 2013 at 8:22 AM, Mark Dunning <mark.dunning at="" gmail.com=""> >> wrote: >>> >>> Hi, >>> >>> I was just wondering if there was an option to save a 'Tracks' object >>> to disk using a ggsave-like command? >>> >>> > p<- tracks(p.ideo, Gene = p1,Probes=p2,main=gene,heights=c(1,5,3)) >>> > ggsave(p,file="tracks.png") >>> Error in ggsave(p, file = "tracks.png") : plot should be a ggplot2 plot >>> >>> Regards, >>> >>> Mark >>> >>> _______________________________________________ >>> Bioconductor mailing list >>> Bioconductor at r-project.org >>> https://stat.ethz.ch/mailman/listinfo/bioconductor >>> Search the archives: >>> http://news.gmane.org/gmane.science.biology.informatics.conductor >> >> >> >> >> -- >> Tengfei Yin >> MCDB PhD student >> 1620 Howe Hall, 2274, >> Iowa State University >> Ames, IA,50011-2274 >> >> > > > > -- > Tengfei Yin > MCDB PhD student > 1620 Howe Hall, 2274, > Iowa State University > Ames, IA,50011-2274 > >
ADD REPLYlink written 6.7 years ago by Mark Dunning1.1k
Answer: ggsave option for ggbio Tracks function
0
gravatar for kevin.rue
3.4 years ago by
kevin.rue220
University of Oxford
kevin.rue220 wrote:

Hi,

I feel like I have to bring this subject back to the top, as I have issues ggsave-ing the output of autoplot (...).
I can see that the output of autoplot has class "GGbio", not "ggplot". Is that a big difference? It seems overkill to go and change the source code of ggbio::ggplot to remove the check as suggested in previous posts.

Essentially my code is:

gg <- autoplot(grange.object, geom = "point", coord = "genome", aes(y = mLogP))
ggsave(filename = "Manhattan.png", plot = gg, path = outfolder)

With:

> inherits(gg, "ggplot")
[1] FALSE
> class(gg)
[1] "GGbio"
attr(,"package")
[1] "ggbio"

I am using

> utils::packageVersion("ggbio")
[1] ‘1.18.5’

Many thanks in advance for advice!
Kevin

 

ADD COMMENTlink written 3.4 years ago by kevin.rue220

Quick correction, ggbio::ggsave does not complain if I do not specify the "plot=" argument (which then defaults to "last_plot()").

Glad that I found a workaround, although I am not getting the logic of the function here; the help page of the ggbio::autoplot function says that the value should be: "A ggplot object, so you can use common features from ggplot2 package to manipulate the plot."

ADD REPLYlink modified 3.4 years ago • written 3.4 years ago by kevin.rue220
Please log in to add an answer.

Help
Access

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.
Powered by Biostar version 16.09
Traffic: 289 users visited in the last hour