65 votes

Modifier les polices dans ggplot2

Je cherche un moyen de modifier les types de police dans ggplot. Pour l'instant, je serais assez content de simplement changer les polices pour la famille de polices 'courier', mais mon objectif ultime est d'appeler un modèle de police personnalisé--toute aide sur ce dernier point serait grandement appréciée.

J'ai fait un peu de devoir, en regardant les posts et articles suivants:

Cela peut être parce que je suis encore un amateur désespéré avec ggplot2, mais je n'ai même pas été en mesure de changer les polices de graphique en courier. Aidez-moi? J'ai inclus les données pour le graphique en question, ci-dessous, ainsi que le code, donc espérons que tout cela est assez facile à suivre.

0 votes

Que diriez-vous de tikzDevice et de XeTeX?

33voto

Steve Powell Points 198

Je pense que votre réponse est bonne mais vous pouvez le faire de manière plus simple:

install.packages("extrafont");library(extrafont)
font_import("Trebuchet MS")
library(ggplot2)
qplot(1:10)+theme(text=element_text(family="Trebuchet MS"))

0 votes

Tel que je peux le dire, pour annotate() vous devez fournir les informations de police, par exemple family = myfamily, fontface = myfontfacemyfamily et myfontface doivent être cohérents avec ce qui est passé à theme() selon votre approche. Un peu ennuyeux si vous avez plusieurs appels de annotate(). Je n'ai pas vérifié, mais je ne pense pas que la réponse ci-dessus traite également de annotate().

30voto

Aaron Points 866

Résolu ma requête avec assez peu de tracas. C'était une solution en deux étapes à laquelle je n'aurais pas abouti sans suivre les conseils des membres qui ont répondu.

Pour modifier les paramètres de texte ggplot par défaut, j'ai adapté le code auquel Brandon m'a renvoyé à l'adresse :

http://johndunavent.com/combined-line-and-bar-chart-ggplot2

Où John Dunavent crée une fonction, theme_min, qui peut être modifiée pour fournir les options par défaut d'un ggplot, y compris l'utilisation de polices importées de Windows avec la commande windowsFonts. Mon adaptation de son code ressemble à ceci :

theme_min = function (size=10, font=NA, face='plain', 
    panelColor=couleurFond, axisColor='#999999', 
    gridColor=couleurLignesGrille, textColor='black') 
{
    theme_text = function(...)
        ggplot2::theme_text(family=font, face=face, colour=textColor, 
            size=size, ...)

opts(
    axis.text.x = theme_text(),
    axis.text.y = theme_text(),
    axis.line = theme_blank(),
    axis.ticks = theme_segment(colour=axisColor, size=0.25),
    panel.border = theme_rect(colour=couleurFond),
    legend.background = theme_blank(),
    legend.key = theme_blank(),
    legend.key.size = unit(1.5, 'lines'),
    legend.text = theme_text(hjust=0),
    legend.title = theme_text(hjust=0),
    panel.background = theme_rect(fill=panelColor, colour=NA),
    panel.grid.major = theme_line(colour=gridColor, size=0.33),
    panel.grid.minor = theme_blank(),
    strip.background = theme_rect(fill=NA, colour=NA),
    strip.text.x = theme_text(hjust=0),
    strip.text.y = theme_text(angle=-90),
    plot.title = theme_text(hjust=0),
    plot.margin = unit(c(0.1, 0.1, 0.1, 0.1), 'lines'))
}

##Créer un type de police personnalisé. Peut être 'F', 'TEST', peu importe
windowsFonts(F = windowsFont('Wide Latin'))

##et insérer cette ligne de code dans le code original que j'ai énuméré ci-dessus: 
+ theme_min(font='F', size=10) 

Malheureusement, il n'y a pas moyen (que j'aie trouvé) de modifier de manière générique les paramètres de police pour les objets geom_text avant de créer un graphique. La solution de James ci-dessus a parfaitement fonctionné pour cela. Au lieu d'utiliser une police standard, j'ai défini fontfamily="F" pour intégrer la police personnalisée que j'ai sélectionnée dans theme_min(), c'est-à-dire :

grid.gedit("GRID.text",gp=gpar(fontfamily="F"))

J'espère que cela sera utile à d'autres utilisateurs cherchant à modifier les polices sur leurs graphiques.

Merci à tous ceux qui m'ont aidé à résoudre cela ! Aaron

1 votes

Il convient de noter que la commande opts est obsolète depuis un certain temps dans ggplot2. Vous devriez (pour la plupart ?) pouvoir utiliser le code ci-dessus en remplaçant opts par theme. Certains éléments spécifiques comme theme_text doivent probablement être modifiés en element_text.

0 votes

Excellente utilisation de 'F' ;-)

11voto

Thierry Points 6246

Jetez un œil à l'argument de famille de theme_text()

dummy <- data.frame(A = rnorm(10), B = rnorm(10))
ggplot(dummy, aes(x = A, y = B)) + geom_point()
#helvetica = default
ggplot(dummy, aes(x = A, y = B)) + geom_point() + opts(axis.title.x = theme_text(family = "sans", face = "bold"))
#times
ggplot(dummy, aes(x = A, y = B)) + geom_point() + opts(axis.title.x = theme_text(family = "serif", face = "bold"))
#courier 
ggplot(dummy, aes(x = A, y = B)) + geom_point() + opts(axis.title.x = theme_text(family = "mono", face = "bold"))

1 votes

Génial, merci Thierry - c'était en effet la façon de modifier les types de police en utilisant la bibliothèque de polices incluses dans la bibliothèque de polices standard de R. Maintenant, il faut trouver comment implémenter des polices personnalisées. Je vais regarder certains de ces autres messages...

5voto

Neil Best Points 326

Inpiré par un article sur le blog de kohske, j'ai pensé à cela :

theme_set( theme_bw( base_family= "serif"))

theme_update( panel.grid.minor= theme_blank(),
             panel.grid.major= theme_blank(),
             panel.background= theme_blank(),
             axis.title.x= theme_blank(),
             axis.text.x= theme_text( family= "serif",
               angle= 90, hjust= 1 ),
             axis.text.x= theme_text( family= "serif"),
             axis.title.y= theme_blank())

theme_map <- theme_get()

theme_set( theme_bw())

Maintenant, lorsque je veux utiliser ce thème particulier :

last_plot() + theme_map

Votre expérience peut varier.

Par la même occasion, si j'avais le pouvoir, je voterais contre la réponse préférée :

> grid.gedit("GRID.text",gp=gpar(fontfamily="mono"))
Error in editDLfromGPath(gPath, specs, strict, grep, global, redraw) :
  'gPath' (GRID.text) not found

Je ne suis pas sûr de ce que cela signifie. Je n'ai pas non plus eu de lien pour commenter cette réponse; peut-être que quelque chose a changé sur le site.

1 votes

Salut Neil, je ne suis toujours pas expert en ggplot2, mais il me semble que la solution que tu as trouvée ici fonctionne bien lorsque l'on utilise des paramètres de police/thème nativement disponibles dans R et ggplot2. J'avais besoin de pouvoir importer n'importe quelle police personnalisée de la bibliothèque Windows pour mes graphiques, et la solution que Brandon et James m'ont aidé à trouver fonctionne parfaitement. Voici comment j'utilise grid.gedit: windowsFonts(F = windowsFont(chartFont)) grid.gedit("GRID.text",gp=gpar(fontfamily="F")) Assure-toi que la famille de polices que tu veux est disponible.

0 votes

@NeilBest L'erreur signifie que vous n'avez pas de couches de texte dans votre graphique - c'est-à-dire que vous n'avez pas utilisé geom_text

1 votes

Cela ne semble plus fonctionner ( du moins pour moi). Mais une solution de contournement qui fonctionne est : theme_map$text$family = 'nouvelle police'

2voto

James Points 24725

Vous pouvez définir la police des libellés produits par geom_text avec grid.gedit:

grid.gedit("GRID.text",gp=gpar(fontfamily="mono"))

Appelez ceci après avoir produit votre graphique d'origine.

0 votes

Grands commentaires, tous, merci beaucoup. Brandon, votre suggestion était tout à fait pertinente, sauf que j'ai du mal à utiliser la méthode trouvée sur johndunavent.com/combined-line-and-bar-chart-ggplot2 pour modifier les étiquettes de police geom_text. James, je ne sais pas si vous connaissez ce post, mais comment puis-je utiliser votre solution (qui a parfaitement fonctionné) pour modifier les polices des étiquettes geom_text avec une police que j'ai importée dans R en utilisant la commande windowsFonts()? Merci pour toute votre aide! Jeff, je vais jeter un œil à Cairo si je continue à me heurter à un mur ici...

0 votes

windowsFonts(Verdana="TT Verdana") puis vous pouvez utiliser fontfamily="Verdana". Vous voudrez peut-être aussi définir les étiquettes des axes et les titres avec "axis.text" et "axis.title" dans le premier argument. Ce lien est désormais mort d'ailleurs, mais vous pouvez toujours en obtenir certains via le cache Google.

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