Scaling Lattice Graphics for tikzDevice

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Scaling Lattice Graphics for tikzDevice

Elliot
I'm trying to use lattice graphics to produce some small plots for inclusion in a LaTeX file. I want the LaTeX fonts to be used in the plots, but to be scaled down to match the size of the plot. I have written the following code to apply a scaling factor to all the "cex" and "padding" entries in the trellis parameters, but there is still a large white space between the key and the top of the plot area. Does anyone know how I can get rid of that (or if I'm going about this all wrong and there's a much cleaner way)?

## ------ ##
## test.R ##
## ------ ##

require(tikzDevice)                                                                                                                                                                
require(lattice)                                                                                                                                                                  
                                                                                                                                                                                   
rescale.pars <- function(cex.factor     = 0.5,                                                                                                                                    
                         padding.factor = 0.25,                                                                                                                                    
                         pars           = trellis.par.get()) {                                                                                                                    
                                                                                                                                                                                   
  result <- NULL                                                                                                                                                                  
  for (i in seq_along(pars)) {                                                                                                                                                    
                                                                                                                                                                                   
    if (names(pars)[[i]] == "cex") {                                                                                                                                              
                                                                                                                                                                                   
      if (is.null(result)) {                                                                                                                                                      
        result <- list()                                                                                                                                                          
      }                                                                                                                                                                            
      result <- c(result, cex=cex.factor*pars[[i]])                                                                                                                                
                                                                                                                                                                                   
    } else if (grepl("padding$", names(pars)[[i]])) {                                                                                                                              
                                                                                                                                                                                   
      if (is.null(result)) {                                                                                                                                                      
        result <- list()                                                                                                                                                          
      }                                                                                                                                                                            
      eval(parse(text=sprintf("result <- c(result, %s=padding.factor*pars[[i]])", names(pars)[[i]])))                                                                              
                                                                                                                                                                                   
    } else if (inherits(pars[[i]], "list")) {                                                                                                                                      
                                                                                                                                                                                   
      temp <- rescale.pars(cex.factor, padding.factor, pars[[i]])                                                                                                                  
      if (!is.null(temp)) {                                                                                                                                                        
        result[[names(pars)[[i]]]] <- temp                                                                                                                                        
      }                                                                                                                                                                            
                                                                                                                                                                                   
    }                                                                                                                                                                              
  }                                                                                                                                                                                
                                                                                                                                                                                   
  return (result)                                                                                                                                                                  
}                                                                                                                                                                                  
                                                                                                                                                                                   
x <- 1:100                                                                                                                                                                        
y <- cumsum(rnorm(length(x), 1, 10))                                                                                                                                              
z <- cumsum(rnorm(length(x), 1, 20))                                                                                                                                              
                                                                                                                                                                                   
tikz("test-plot.tex", width=2, height=2)                                                                                                                                          
                                                                                                                                                                                   
xyplot(y + z ~ x,                                                                                                                                                                  
       main = "My Plot",                                                                                                                                                          
       xlab = "x",                                                                                                                                                                                    
       auto.key=list(text=c("Line 1", "Line 2"), points=FALSE, lines=TRUE),                                                                                                        
       grid = TRUE,                                                                                                                                                                
       par.settings = rescale.pars())                                                                                                                                              
                                                                                                                                                                                   
dev.off()                                                    

## ---------- ##
## END R CODE ##
## ---------- ##

Thanks.

- Elliot

-----------------------------
Elliot Joel Bernstein, Ph.D. | Research Associate | FDO Partners, LLC
134 Mount Auburn Street | Cambridge, MA | 02138
Phone: (617) 503-4619 | Email: [hidden email]

______________________________________________
[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
|

Re: Scaling Lattice Graphics for tikzDevice

Deepayan Sarkar
On Fri, Feb 18, 2011 at 11:04 PM, Elliot Joel Bernstein
<[hidden email]> wrote:
> I'm trying to use lattice graphics to produce some small plots for inclusion in a LaTeX file. I want the LaTeX fonts to be used in the plots, but to be scaled down to match the size of the plot. I have written the following code to apply a scaling factor to all the "cex" and "padding" entries in the trellis parameters, but there is still a large white space between the key and the top of the plot area. Does anyone know how I can get rid of that (or if I'm going about this all wrong and there's a much cleaner way)?
>
> ## ------ ##
> ## test.R ##
> ## ------ ##
>
> require(tikzDevice)

I have not (yet) used tikzDevice, so don't know what impact it will
have, but in my experience with pdf(), it's usually more effective to
create a larger file and then scale it when including it in the .tex
file.

-Deepayan

> require(lattice)
>
> rescale.pars <- function(cex.factor     = 0.5,
>                         padding.factor = 0.25,
>                         pars           = trellis.par.get()) {
>
>  result <- NULL
>  for (i in seq_along(pars)) {
>
>    if (names(pars)[[i]] == "cex") {
>
>      if (is.null(result)) {
>        result <- list()
>      }
>      result <- c(result, cex=cex.factor*pars[[i]])
>
>    } else if (grepl("padding$", names(pars)[[i]])) {
>
>      if (is.null(result)) {
>        result <- list()
>      }
>      eval(parse(text=sprintf("result <- c(result, %s=padding.factor*pars[[i]])", names(pars)[[i]])))
>
>    } else if (inherits(pars[[i]], "list")) {
>
>      temp <- rescale.pars(cex.factor, padding.factor, pars[[i]])
>      if (!is.null(temp)) {
>        result[[names(pars)[[i]]]] <- temp
>      }
>
>    }
>  }
>
>  return (result)
> }
>
> x <- 1:100
> y <- cumsum(rnorm(length(x), 1, 10))
> z <- cumsum(rnorm(length(x), 1, 20))
>
> tikz("test-plot.tex", width=2, height=2)
>
> xyplot(y + z ~ x,
>       main = "My Plot",
>       xlab = "x",
>       auto.key=list(text=c("Line 1", "Line 2"), points=FALSE, lines=TRUE),
>       grid = TRUE,
>       par.settings = rescale.pars())
>
> dev.off()
>
> ## ---------- ##
> ## END R CODE ##
> ## ---------- ##
>
> Thanks.
>
> - Elliot
>
> -----------------------------
> Elliot Joel Bernstein, Ph.D. | Research Associate | FDO Partners, LLC
> 134 Mount Auburn Street | Cambridge, MA | 02138
> Phone: (617) 503-4619 | Email: [hidden email]
>
> ______________________________________________
> [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
|

Re: Scaling Lattice Graphics for tikzDevice

Dieter Menne
In reply to this post by Elliot
Elliot Joel Bernstein wrote
I'm trying to use lattice graphics to produce some small plots for inclusion in a LaTeX file. I want the LaTeX fonts to be used in the plots, but to be scaled down to match the size of the plot.
I agree with Deepayan. With tikzdevice, tust try to get the overall look good, and use \resizebox or \scalebox in latex.

Dieter

Reply | Threaded
Open this post in threaded view
|

Re: Scaling Lattice Graphics for tikzDevice

Elliot
In reply to this post by Deepayan Sarkar
On Feb 18, 2011 11:02 PM, "Deepayan Sarkar" <[hidden email]>
wrote:
>
> On Fri, Feb 18, 2011 at 11:04 PM, Elliot Joel Bernstein
> <[hidden email]> wrote:
> > I'm trying to use lattice graphics to produce some small plots for
inclusion in a LaTeX file. I want the LaTeX fonts to be used in the plots,
but to be scaled down to match the size of the plot. I have written the
following code to apply a scaling factor to all the "cex" and "padding"
entries in the trellis parameters, but there is still a large white space
between the key and the top of the plot area. Does anyone know how I can get
rid of that (or if I'm going about this all wrong and there's a much cleaner
way)?

> >
> > ## ------ ##
> > ## test.R ##
> > ## ------ ##
> >
> > require(tikzDevice)
>
> I have not (yet) used tikzDevice, so don't know what impact it will
> have, but in my experience with pdf(), it's usually more effective to
> create a larger file and then scale it when including it in the .tex
> file.
>
> -Deepayan
>
> > require(lattice)
> >
> > rescale.pars <- function(cex.factor     = 0.5,
> >                         padding.factor = 0.25,
> >                         pars           = trellis.par.get()) {
> >
> >  result <- NULL
> >  for (i in seq_along(pars)) {
> >
> >    if (names(pars)[[i]] == "cex") {
> >
> >      if (is.null(result)) {
> >        result <- list()
> >      }
> >      result <- c(result, cex=cex.factor*pars[[i]])
> >
> >    } else if (grepl("padding$", names(pars)[[i]])) {
> >
> >      if (is.null(result)) {
> >        result <- list()
> >      }
> >      eval(parse(text=sprintf("result <- c(result,
%s=padding.factor*pars[[i]])", names(pars)[[i]])))

> >
> >    } else if (inherits(pars[[i]], "list")) {
> >
> >      temp <- rescale.pars(cex.factor, padding.factor, pars[[i]])
> >      if (!is.null(temp)) {
> >        result[[names(pars)[[i]]]] <- temp
> >      }
> >
> >    }
> >  }
> >
> >  return (result)
> > }
> >
> > x <- 1:100
> > y <- cumsum(rnorm(length(x), 1, 10))
> > z <- cumsum(rnorm(length(x), 1, 20))
> >
> > tikz("test-plot.tex", width=2, height=2)
> >
> > xyplot(y + z ~ x,
> >       main = "My Plot",
> >       xlab = "x",
> >       auto.key=list(text=c("Line 1", "Line 2"), points=FALSE,
lines=TRUE),

> >       grid = TRUE,
> >       par.settings = rescale.pars())
> >
> > dev.off()
> >
> > ## ---------- ##
> > ## END R CODE ##
> > ## ---------- ##
> >
> > Thanks.
> >
> > - Elliot
> >
> > -----------------------------
> > Elliot Joel Bernstein, Ph.D. | Research Associate | FDO Partners, LLC
> > 134 Mount Auburn Street | Cambridge, MA | 02138
> > Phone: (617) 503-4619 | Email: [hidden email]
> >
> > ______________________________________________
> > [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.
> >

Deepayan -

Thank you for your reply. In the past I've generally done what you suggest,
but I'm trying to use tikz so the graphics can inherit the fonts used in the
LaTeX document. Is there a way to do that with the pdf device?

Thanks.

- Elliot

        [[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
|

Re: Scaling Lattice Graphics for tikzDevice

Deepayan Sarkar
On Sun, Feb 20, 2011 at 5:23 AM, Elliot Joel Bernstein
<[hidden email]> wrote:

>
> On Feb 18, 2011 11:02 PM, "Deepayan Sarkar" <[hidden email]>
> wrote:
>>
>> On Fri, Feb 18, 2011 at 11:04 PM, Elliot Joel Bernstein
>> <[hidden email]> wrote:
>> > I'm trying to use lattice graphics to produce some small plots for
>> > inclusion in a LaTeX file. I want the LaTeX fonts to be used in the plots,
>> > but to be scaled down to match the size of the plot. I have written the
>> > following code to apply a scaling factor to all the "cex" and "padding"
>> > entries in the trellis parameters, but there is still a large white space
>> > between the key and the top of the plot area. Does anyone know how I can get
>> > rid of that (or if I'm going about this all wrong and there's a much cleaner
>> > way)?
>> >
>> > ## ------ ##
>> > ## test.R ##
>> > ## ------ ##
>> >
>> > require(tikzDevice)
>>
>> I have not (yet) used tikzDevice, so don't know what impact it will
>> have, but in my experience with pdf(), it's usually more effective to
>> create a larger file and then scale it when including it in the .tex
>> file.
>>
>> -Deepayan
>>

[...]

>
> Deepayan -
>
> Thank you for your reply. In the past I've generally done what you suggest,
> but I'm trying to use tikz so the graphics can inherit the fonts used in the
> LaTeX document. Is there a way to do that with the pdf device?

Probably not, but look at the ?cairo_pdf device. It can use locally
installed truetype fonts through fontconfig, and truetype versions of
computer modern are available (I knew the details once, but don't have
time to find them again right now).

Also look at http://www.stat.auckland.ac.nz/~paul/R/CM/CMR.html

-Deepayan

______________________________________________
[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.