2016-03-19 7 views
1

Ich hätte gerne Grafiken von ggplot2 in ein LaTeX-Dokument mit der Breite von \textwidth (oder \columnwidth in einem zweispaltigen Dokument) eingefügt eingefügt. Ich habe die folgende Lösung:Ausrichtung panel.background anstelle von plot.background mit Dokumentenrändern

\documentclass{article} 
\usepackage{lipsum, graphicx} 

<<knitrOpts, echo=FALSE>>= 
knitr::opts_chunk$set(echo = FALSE, 
         fig.show = 'hide', 
         fig.width=general_fig_width <- 5, 
         fig.height=3, 
         out.width = out_width <- "5in", 
         out.height="3in" 
        ) 
@ 
\usepackage{geometry} 

\setlength{\textwidth}{\Sexpr{out_width}} 

<<loadPackages>>= 
library(ggplot2) 
library(dplyr) 
library(grid) 
@ 

\begin{document} 
<<plot>>= 
diamonds %>% 
    sample_frac(0.3) %>% 
    ggplot(aes(x = carat, y = price)) + 
    geom_point() + 
    theme_dark() + 
    theme(plot.margin = unit(c(0,0,0,0), "pt")) 

grid.ls(view=TRUE,grob=FALSE) 
current.vpTree() 
seekViewport('panel.3-4-3-4') 
a <- convertWidth(unit(1,'npc'), 'inch', TRUE) 


width_factor <- general_fig_width/a 
@ 

\lipsum 
\begin{figure}[t] 
\makebox[\textwidth][r]{\includegraphics[width=\Sexpr{width_factor}\textwidth]{figure/plot-1}} 
\end{figure} 
\lipsum 

\end{document} 

enter image description here

Allerdings ist die Lösung nicht, wenn eine Legende hinzugefügt:

diamonds %>% 
    sample_frac(0.3) %>% 
    ggplot(aes(x = carat, y = price, color = price)) + 
    geom_point() + 
    theme_dark() + 
    theme(plot.margin = unit(c(0,0,0,0), "pt")) 

enter image description here

Die Legende vermasselt die Ausrichtung auf. Das Setzen des pos Arguments in \makebox funktioniert nicht, da der Hintergrund nicht zentriert ist. Ich verstehe, dass ich die Legende auf die Karte setzen könnte, aber ich hätte lieber die Option, dass die Legende in den Rand eindringt.

Antwort

4

Sie wahrscheinlich Größen leichter abfragen finden, wenn Sie mit dem gtable arbeiten,

--- 
title: "Untitled" 
header-includes: 
    - \usepackage{lipsum} 
output: 
    pdf_document: 
    fig_caption: yes 
    fig_crop: no 
    keep_tex: yes 
geometry: width=5in 
--- 

```{r setup, include=FALSE} 
library(ggplot2) 
library(dplyr) 
library(grid) 
library(knitr) 
general_fig_width <- 5 
``` 

```{r plot, fig.show=FALSE} 
p <- diamonds %>% 
    sample_frac(0.3) %>% 
    ggplot(aes(x = carat, y = price, color = price)) + 
    geom_point() + 
    theme_dark() + 
    theme(plot.margin = unit(c(0,0,0,0), "pt")) 

g <- ggplotGrob(p) 

if(getRversion() < "3.3.0"){ 
    g$widths <- grid:::unit.list(g$widths) 
    g$widths[4] <- list(unit(general_fig_width, "in")) 
} else { 
    g$widths[4] <- unit(general_fig_width, "in") 
} 
fig_width <- convertWidth(sum(g$widths), "in", valueOnly = TRUE) 
left_width <- convertWidth(sum(g$widths[1:3]), "in", valueOnly = TRUE) 
ggsave('plot-tmp.pdf', width=fig_width, height=2) 
``` 

\begin{figure}[!hb] 
\hspace{`r -left_width`in}\includegraphics[width=`r fig_width`in]{plot-tmp} 
\end{figure} 

\lipsum[2] 

enter image description here

+0

ich den Fehler 'Fehler in grid.Call (L_convert bekommen, x, as.integer (whatfrom), as.integer (whatto),: INTEGER() kann nur auf 'integer', nicht auf 'nULL' in der Zeile 'fig_width <-' angewendet werden. Es sieht aus wie die Umwandlung' g $ widths [4] <- unit (...) 'hat keinen Effekt – Hugh

+0

probiere' g $ widthes [4] <- list (unit (general_fig_width, "in")) 'stattdessen benutze ich R-devel und da war eine kürzliche Änderung re '[<-. Einheit' – baptiste

+0

Seltsamerweise 'fig_width <- convertWidth (Summe (g $ Breite [-4]) + Einheit (g $ Breite [4]," in ")," in ", valueOnly = TRUE) funktioniert einwandfrei. – Hugh