3 votes

Créer un rectangle rempli de texte

Je voudrais créer un rectangle rempli en R, avec du texte blanc centré au milieu, et l'exporter en png. Je sais que la fonction rect() peut probablement le faire, mais dans tous les exemples que j'ai vu, le rectangle est imprimé sur un graphique. Existe-t-il un moyen de le faire sans le graphique?

Pour référence, je construis un site blogdown() et j'essaie de créer un carré qui ressemble à s'y méprendre à ceux du thème Hugrid.

3voto

Pgibas Points 677

Vous pouvez utiliser geom_rect() pour créer des rectangles et geom_text() pour coller du texte dedans. La modification de l'apparence du rectangle (couleur, taille de ligne ou type) dans ggplot2 est facile. Vous devez simplement supprimer l'apparence par défaut de ggplot2 avec theme_classsic() et element_blank().

# Générer un jeu de données factice
foo <- data.frame(x1 = 1, x2 = 2, y1 = 1, y2 = 2,
                  text = paste(letters[1:3], letters[1:3], collapse = "\n"))

# Tracer un rectangle avec du texte
library(ggplot2)
ggplot(foo) +
    geom_rect(aes(xmin = x1, xmax = x2, ymin = y1, ymax = y2),
              color = "black", size = 2, fill = "lightblue") +
    geom_text(aes(x = x1 + (x2 - x1) / 2, y = y1 + (y2 - y1) / 2,
                  label = text),
              size = 20) +
    theme_classic() +
    theme(axis.line  = element_blank(),
          axis.ticks = element_blank(),
          axis.text  = element_blank(),
          axis.title = element_blank())

enter image description here

2voto

baptiste Points 19677

Voici une solution légère,

rects <- data.frame(fill = RColorBrewer::brewer.pal(5, "Pastel1"),
                    colour = RColorBrewer::brewer.pal(5, "Set1"),
                    label = paste("text", 1:5), stringsAsFactors = FALSE)
library(gridExtra)
gl <- mapply(function(f,l,c) grobTree(rectGrob(gp=gpar(fill=f, col="white",lwd=2)),
                                      textGrob(l, gp=gpar(col=c))),
             f = rects$fill, l = rects$label, c = rects$colour,
             SIMPLIFY = FALSE)

grid.arrange(grobs=gl)

enter image description here

1voto

Claus Wilke Points 7757

Il n'est pas tout à fait clair dans votre question quel est exactement le problème. Avez-vous besoin de générer les rectangles à partir de R (au lieu de le faire manuellement dans Illustrator par exemple) ? Et aucune fenêtre de tracé ne doit être affichée ?

Tout cela peut être accompli. Je préfère dessiner avec ggplot2, et les géométries spécifiques dont vous auriez besoin ici sont geom_tile() pour les rectangles et geom_text() pour le texte. Et vous pouvez enregistrer en png sans générer un tracé en utilisant ggsave().

rects <- data.frame(x = 1:4,
                    colors = c("red", "green", "blue", "magenta"),
                    text = paste("text", 1:4))

library(ggplot2)
p <- ggplot(rects, aes(x, y = 0, fill = colors, label = text)) +
  geom_tile(width = .9, height = .9) + # make square tiles
  geom_text(color = "white") + # add white text in the middle
  scale_fill_identity(guide = "none") + # color the tiles with the colors in the data frame
  coord_fixed() + # make sure tiles are square
  theme_void() # remove any axis markings

ggsave("test.png", p, width = 4.5, height = 1.5)

entrer la description de l'image ici

J'ai créé quatre rectangles dans cet exemple. Si vous n'avez besoin que d'un seul, vous pouvez simplement créer un data frame d'entrée avec une seule ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X