65 votes

Modifier les polices de caractères dans ggplot2

Je cherche un moyen de modifier les types de police dans ggplot. Pour l'instant, je me contenterais de changer les polices pour la famille de polices 'courier', mais mon objectif final est d'appeler un modèle de police personnalisé - toute contribution sur ce dernier point serait très appréciée.

J'ai fait un peu de recherche en consultant les articles et les messages suivants :

C'est peut-être parce que je suis toujours un amateur désespéré de ggplot2, mais je n'ai même pas réussi à changer les polices des graphiques en courier. Avez-vous de l'aide ? J'ai inclus les données du graphique en question, ci-dessous, ainsi que le code, en espérant que tout cela soit assez facile à suivre.

0 votes

Comment tikzDevice et XeTeX ?

33voto

Steve Powell Points 198

Je pense que votre réponse est bonne mais vous pouvez le faire plus simplement :

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

0 votes

D'après ce que je sais, pour annotate() vous devez fournir les informations relatives à la police, par ex. family = myfamily, fontface = myfontface où le myfamily y myfontface doit être cohérent avec ce qui est transmis à theme() selon votre approche. Un peu embêtant si vous avez plusieurs annotate() appels. Je n'ai pas vérifié mais je ne pense pas que la réponse ci-dessus traite de annotate() soit.

30voto

Aaron Points 866

Il a résolu ma question avec un minimum de problèmes. C'était une solution en deux étapes à laquelle je ne serais pas arrivé sans suivre les conseils des membres qui ont répondu.

Pour modifier les valeurs par défaut du texte de ggplot, j'ai adapté le code auquel Brandon m'a renvoyé à :

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 des 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=backgroundColor, axisColor='#999999', 
    gridColor=gridLinesColor, 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=backgroundColor),
    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'))
}

##Create a custom font type. Could be 'F', 'TEST', whatever
windowsFonts(F = windowsFont('Wide Latin'))

##and insert this line of code into the original code I list above: 
+ theme_min(font='F', size=10) 

De façon maladroite, il n'existe aucun moyen (que j'ai trouvé) de modifier de façon générique les paramètres de la police pour les objets geom_text avant la création d'un tracé. La solution proposée par James ci-dessus a toutefois parfaitement fonctionné dans ce cas. Au lieu d'utiliser une police standard, j'ai défini fontfamily="F" pour faire intervenir 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 à tous les autres utilisateurs qui cherchent à modifier les polices sur leurs graphiques.

Merci à tous ceux qui m'ont aidé à résoudre ce problème ! Aaron

1 votes

Non pas que le opts a été dépréciée dans ggplot2 depuis un certain temps. Vous devriez (la plupart du temps ?) être en mesure d'utiliser le code ci-dessus en remplaçant opts con theme . Certaines spécifications d'éléments comme theme_text doivent probablement être modifiés en element_text

0 votes

Grande utilisation de 'F' ;-)

11voto

Thierry Points 6246

Regardez l'argument 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

Super, merci Thierry - c'était en effet le moyen de modifier les types de polices en utilisant la bibliothèque de polices incluse dans la bibliothèque de familles de polices standard de R. Il ne s'agit pas de trouver comment mettre en œuvre des polices personnalisées. Je vais regarder certains de ces autres messages...

5voto

Neil Best Points 326

Inspiré par un poste on kohske J'ai trouvé cette idée sur le blog d'un ami :

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, quand je veux utiliser ce thème particulier :

last_plot() + theme_map

YMMV.

BTW, 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. On ne m'a pas non plus proposé de lien pour commenter cette réponse ; peut-être que quelque chose a changé sur le site.

1 votes

Bonjour Neil, je ne suis toujours pas un expert en ggplot2, mais il me semble que la solution que vous avez trouvée ici fonctionne bien lorsque vous utilisez les paramètres de police/thème qui sont 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 tracés, et la solution que Brandon et James m'ont aidée à mettre au point fonctionne à merveille. Voici comment j'utilise grid.gedit : windowsFonts(F = windowsFont(chartFont)) grid.gedit("GRID.text",gp=gpar(fontfamily="F")) Vous devez vous assurer que la famille de polices que vous souhaitez est disponible.

0 votes

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

1 votes

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

2voto

James Points 24725

Vous pouvez définir la police de caractères des étiquettes produites par geom_text con grid.gedit :

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

Appelez-le après avoir produit votre intrigue originale.

0 votes

Excellents commentaires, tous, merci beaucoup. Brandon, votre suggestion était tout à fait pertinente, sauf que j'ai du mal à utiliser la méthode trouvée à l'adresse suivante johndunavent.com/combined-line-and-bar-chart-ggplot2 pour modifier les étiquettes de police de geom_text. James, je ne sais pas si vous connaissez cet article, 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 introduite dans R à l'aide de la commande windowsFonts() ? Merci pour votre aide ! Jeff, je vérifierai au Caire si je continue à me heurter à un puits de briques ici...

0 votes

windowsFonts(Verdana="TT Verdana") alors vous pouvez utiliser fontfamily="Verdana" . Vous pouvez également définir les étiquettes et les titres des axes avec "axis.text" y "axis.title" dans le premier argument. Ce lien est d'ailleurs maintenant mort, mais vous pouvez toujours en obtenir par le biais du cache de 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