6
votes

R Markdown: Comment faire flotter le texte autour des figures?

J'ai créé un organigramme avec R que j'ai inclus dans mon fichier R Markdown.

À quoi il ressemble maintenant: entrez la description de l'image ici

Le code:

```{r flowchart-data, echo = FALSE, message = FALSE, fig.cap = "Ablauf der Datenverarbeitung", fig.align = "right",  fig.width = 7, fig.height = 6, out.extra = 'trim = {0 1.1cm 0 0}, clip', out.width=".7\\textwidth"}
library(grid)
library(Gmisc)

# grid.newpage()
# set some parameters to use repeatedly
leftx <- .2
midx <- .5
rightx <- .8

myBoxGrob <- function(text, ...) {
  boxGrob(label = text, bjust = "top", box_gp = gpar(fill = "lightgrey"), ...)
}

# create boxes
(Pharmazie <- myBoxGrob("Verbrauchsdaten von der\n Spitalpharmazie  (Excel-Tabelle)", x=leftx, y=1, width = 0.36))
(Finanzen <- myBoxGrob("Belegzahlen vom Ressort\n Finanzen (Excel-Tabelle)", x=rightx, y=1, width = 0.36))
(A <- myBoxGrob("Import der Daten aus Excel ins\n Microsoft Access (Datenbanksoftware)", x=midx, y=0.83, width = 0.45))
(B <- myBoxGrob("Zusammenführen der Informationen\n und erstellen neuer, berechneter Tabellen", x=midx, y=.66, width = 0.45))
(C <- myBoxGrob("Export der neu erstellten Tabellen\n in Form von Excel-Tabellen", x=midx, y=.49, width = 0.45))
(D <- myBoxGrob("Import der neuen Tabellen in R", x=midx, y=.32,  width = 0.45))
(E <- myBoxGrob("Berechnung und grafische Darstellung\n der Grafiken und Tabellen", x=midx, y=.19, width = 0.45))


connectGrob(Pharmazie, A, "L")
connectGrob(Finanzen, A, "L")
connectGrob(A, B, "N")
connectGrob(B, C, "N")
connectGrob(C, D, "N")
connectGrob(D, E, "N")
```

Ce que je voudrais:

  1. Je souhaite que le texte utilise l'espace à gauche de la figure.
  2. Je voudrais que la légende de la figure s'aligne avec le centre de la figure. Pour le moment, la légende est au milieu de la page, ignorant si la figure est centrée, alignée à droite ou à gauche.

Comment puis-je réaliser ces choses?

EDIT 1: Je veux tricoter en pdf.

EDIT 2: Comme demandé dans les commentaires, comment ma page regarde maintenant: À quoi ressemble ma page maintenant


0 commentaires

3 Réponses :


1
votes

Pour autant que je sache, vous pouvez intégrer du code HTML dans un document de démarquage, donc si vous tricotez en HTML, vous pouvez faire quelque chose comme ceci:

Enveloppez la cellule avec un div balise avec le style d'alignement que vous souhaitez (plus besoin d'aligner la cellule), et comme pour la légende, vous pouvez ajouter une boîte transparente en bas avec la légende comme texte à l'intérieur

<div style="float:right">
```{r flowchart-data, echo = FALSE, message = FALSE, fig.width = 7, fig.height = 6}
library(grid)
library(Gmisc)

grid.newpage()
# set some parameters to use repeatedly
leftx <- .2
midx <- .5
rightx <- .8

myBoxGrob <- function(text, ...) {
  boxGrob(label = text, bjust = "top", box_gp = gpar(fill = "lightgrey"), ...)
}

# create boxes

(Pharmazie <- myBoxGrob("Verbrauchsdaten von der\n Spitalpharmazie  (Excel-Tabelle)", x=leftx, y=1, width = 0.36))
(Finanzen <- myBoxGrob("Belegzahlen vom Ressort\n Finanzen (Excel-Tabelle)", x=rightx, y=1, width = 0.36))
(A <- myBoxGrob("Import der Daten aus Excel ins\n Microsoft Access (Datenbanksoftware)", x=midx, y=0.83, width = 0.45))
(B <- myBoxGrob("Zusammenführen der Informationen\n und erstellen neuer, berechneter Tabellen", x=midx, y=.66, width = 0.45))
(C <- myBoxGrob("Export der neu erstellten Tabellen\n in Form von Excel-Tabellen", x=midx, y=.49, width = 0.45))
(D <- myBoxGrob("Import der neuen Tabellen in R", x=midx, y=.32,  width = 0.45))
(E <- myBoxGrob("Berechnung und grafische Darstellung\n der Grafiken und Tabellen", x=midx, y=.19, width = 0.45))
(caption <- boxGrob(label = 'Ablauf der Datenverarbeitung',  x=midx, y=.02, box_gp = gpar(alpha=0)))

connectGrob(Pharmazie, A, "L")
connectGrob(Finanzen, A, "L")
connectGrob(A, B, "N")
connectGrob(B, C, "N")
connectGrob(C, D, "N")
connectGrob(D, E, "N")

```
</div>
And this is the text that would go to the left of the chart.


1 commentaires

Je suis désolé, j'aurais dû préciser, je tricote en pdf. J'ai trouvé cette solution et je l'ai essayée, mais cela ne fonctionne pas lors du tricotage en pdf, malheureusement.



13
votes

Il existe une option chunk appelée fig.env avec laquelle on peut passer de l'environnement figure à l'environnement marginfigure . Malheureusement, la liste des environnements possibles n'inclut pas wrapfigure . Par conséquent, nous allons modifier le bloc de l'intrigue:

---
header-includes:
  - \usepackage{wrapfig}
  - \usepackage{lipsum}
output: 
  pdf_document:
    keep_tex: true
---

```{r, include = F}
defOut <- knitr::knit_hooks$get("plot")  # save the default plot hook 
knitr::knit_hooks$set(plot = function(x, options) {  # set new plot hook ...
  x <- defOut(x, options)  # first apply the default hook
  if(!is.null(options$wrapfigure)) {  # then, if option wrapfigure is given ...
    # create the new opening string for the wrapfigure environment ...
    wf <- sprintf("\\begin{wrapfigure}{%s}{%g\\textwidth}", options$wrapfigure[[1]], options$wrapfigure[[2]])
    x  <- gsub("\\begin{figure}", wf, x, fixed = T)  # and replace the default one with it.
    x  <- gsub("{figure}", "{wrapfigure}", x, fixed = T)  # also replace the environment ending
  }
  return(x)
})
```


Vivamus vehicula leo a justo. Quisque nec augue. Morbi mauris wisi, aliquet vitae, dignissim eget, sollicitudin molestie, ligula. In dictum enim sit amet risus. Curabitur vitae velit eu diam rhoncus hendrerit. Vivamus ut elit. Praesent mattis ipsum quis turpis. Curabitur rhoncus neque eu dui. Etiam vitae magna. Nam ullamcorper. Praesent interdum bibendum magna. Quisque auctor aliquam dolor. Morbi eu lorem et est porttitor fermentum. Nunc egestas arcu at tortor varius viverra. Fusce eu nulla ut nulla interdum consectetuer. Vestibulum gravida. 

```{r echo = F, warning = F, message = F, fig.width=7, fig.height = 6, out.width = ".7\\textwidth", fig.cap = "My Flowchart", fig.align="right", wrapfigure = list("R", .7)}
plot(mpg ~ hp, data = mtcars)
```

Morbi mattis libero sed est. Vivamus vehicula leo a justo. Quisque nec augue. Morbi mauris wisi, aliquet vitae, dignissim eget, sollicitudin molestie, ligula. In dictum enim sit amet risus. Curabitur vitae velit eu diam rhoncus hendrerit. Vivamus ut elit. Praesent mattis ipsum quis turpis. Curabitur rhoncus neque eu dui. Etiam vitae magna. Nam ullamcorper. Praesent interdum bibendum magna. Quisque auctor aliquam dolor. Morbi eu lorem et est porttitor fermentum. Nunc egestas arcu at tortor varius viverra. Fusce eu nulla ut nulla interdum consectetuer. Vestibulum gravida. Morbi mattis libero sed est.

Les commentaires devraient clarifier ce que nous faisons réellement ici. Notez que la valeur attendue de wrapfigure est une liste de deux éléments. Le premier dit à LaTeX de déplacer la figure de chaque côté de la page. Le deuxième élément indique à LaTeX la largeur de la figure enveloppée. Pour déplacer une figure d'une largeur de 0,7 \\ textwidth vers la droite, définissez wrapfigure = list ("R", 0.7) (comme vous l'avez peut-être deviné, L le déplace vers la gauche). Tout ce que nous avons à faire maintenant est d'inclure le package wrapfig dans le YAML et de définir cette option de bloc. Voici un exemple reproductible:

defOut <- knitr::knit_hooks$get("plot")  # save the default plot hook 
knitr::knit_hooks$set(plot = function(x, options) {  # set new plot hook ...
  x <- defOut(x, options)  # first apply the default hook
  if(!is.null(options$wrapfigure)) {  # then, if option wrapfigure is given ...
    # create the new opening string for the wrapfigure environment ...
    wf <- sprintf("\\begin{wrapfigure}{%s}{%g\\textwidth}", options$wrapfigure[[1]], options$wrapfigure[[2]])
    x  <- gsub("\\begin{figure}", wf, x, fixed = T)  # and replace the default one with it.
    x  <- gsub("{figure}", "{wrapfigure}", x, fixed = T)  # also replace the environment ending
  }
  return(x)
})

Notez que cette solution ne fonctionne très probablement qu'avec un bloc créant un seul tracé. Cela devrait être possible dans la mesure où à un bloc contenant plusieurs chiffres.

entrez la description de l'image ici


2 commentaires

Je rencontre un problème où les environnements de figures entrent en collision dans mon document. Dois-je ajouter \ end {wrapfigure} pour éviter cela? J'ai essayé ça et ça n'a pas marché.


Message d'erreur: Package wrapfig Avertissement: Collision entre les environnements d'emballage sur la ligne d'entrée 245. Je pense que cela peut avoir à voir avec les en-têtes de section et la quantité de texte entourant les tracés mais idk. Merci pour toute aide!



5
votes

J'ai eu beaucoup de mal avec ça aussi, mais pour la sortie html. Il y a un argument au bloc r qui a résolu le problème pour moi:

out.extra = 'style = "float: right; padding: 10px"'


4 commentaires

À quoi ressemble le document après avoir appliqué cette suggestion?


J'ai ajouté une photo de son apparence maintenant. Puisque je tricote en pdf et non en html, je ne peux que vous donner l'exemple.


Excellente suggestion. Avez-vous des sources recommandées pour des commandes de style HTML supplémentaires et compatibles?


Parfait, merci de m'avoir présenté out.extra !!! À propos, l'ajout d'une division de compensation aide à garder le flotteur organisé.