web-dev-qa-db-fra.com

Modification des polices dans ggplot2

Je cherche un moyen de modifier les types de police dans ggplot. Pour le moment, je serais assez heureux de simplement changer les polices de caractères dans la famille de polices 'courrier', mais mon objectif ultime 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 travail en consultant les articles et les articles suivants: 

C'est peut-être parce que je suis toujours un amateur sans espoir avec ggplot2, mais je n'ai même pas été en mesure de passer des polices de charte à la messagerie. De l'aide? J'ai inclus les données pour le graphique en question, ci-dessous, avec le code, donc j'espère que tout cela sera assez facile à suivre.

56
Aaron

Trié ma requête avec un minimum de tracas. C'était une solution en deux étapes à laquelle je ne serais pas arrivé sans suivre les conseils des membres qui ont répondu. 

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

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

Lorsque John Dunavent crée une fonction, theme_min, pouvant être modifiée pour fournir les options par défaut d'un ggplot, y compris l'utilisation de polices importées de Windows à l'aide de 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) 

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

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

Espérons que cela sera utile à tout autre utilisateur cherchant à modifier les polices de ses graphiques. 

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

25
Aaron

Je pense que votre réponse est correcte 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"))
29
Steve Powell

Regardez l'argument familial 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"))
11
Thierry

Inspiré par un article sur le blog de kohske , je suis arrivé à ceci:

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

4
Neil Best

Vous pouvez définir la police des étiquettes produites par geom_text avec grid.gedit:

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

Appelez-le après avoir créé votre tracé initial.

2
James

Consultez également le package Cairo, qui prend en charge le remplacement total de toutes les polices par celles de votre choix. http://rforge.net/doc/packages/Cairo/00Index.html

0
Jeff

Cela semble être la solution la plus simple, pour mon argent.

Certains jouent des données en df et en font un simple graphe, "p", avec de jolies étiquettes x et y, afin que nous puissions voir le changement de police:

df <- data.frame(A = rnorm(10), B = rnorm(10))
p = ggplot(data = df, aes(x = A, y = B)) + geom_point()
p = p + xlab("A long x-string so we can see the effect of the font switch")
p = p + ylab("Likewise up the ordinate")

Et nous visualisons le tracé par défaut quelle que soit sa police:

p 

Nous passons maintenant à Optima, en ajoutant quelques titres et sous-titres de Nice pour profiter de la gloire d’Optima:

label = "Now we switch to Optima"
subtitle = "Optima is a Nice font: https://en.wikipedia.org/wiki/Optima#Usages"

Et après tout cela, nous imprimons dans la nouvelle police

# the only line you need to read:
p + theme(text = element_text(family = "Optima", , face = "bold"))
p = p + ggtitle(label = label, subtitle = subtitle)
p

 graph in optima font

0
tim