2010-11-04 2 views
54

Я ищу способ изменения типов шрифтов в ggplot. На данный момент я был бы достаточно счастлив, чтобы просто менять шрифты на семейство шрифтов «курьер», но в конечном итоге моя цель - вызвать пользовательский шаблон шрифта - любой вклад в этом последнем пункте был бы очень оценен.Изменение шрифтов в ggplot2

Я сделал немного домашней работы, глядя на следующие посты и статьи:

Это может быть потому, что я до сих пор безнадежно любитель с ggplot2, но я даже не смог переключить диаграммы шрифтов курьеру. Любая помощь? Я включил данные для рассматриваемой диаграммы ниже, вместе с кодом, поэтому, надеюсь, это все достаточно просто, чтобы следовать.

+0

как о 'tikzDevice' и XeTeX? – baptiste

ответ

24

Отсортирован мой запрос с минимальными хлопотами. Это было двухэтапное решение, к которому я бы не приехал, не следуя советам тех, кто ответил.

Для изменения ggplot текста по умолчанию, я адаптировал код, который Брэндон направил меня к адресу:

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

Где John Dunavent создает функцию, theme_min, которые могут быть отредактированы, чтобы обеспечить параметры по умолчанию для ggplot, включая использование шрифтов, импортированных из Windows с помощью команды windowsFonts. Моя адаптация его код выглядит следующим образом:

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) 

Неудачно, нет никакого способа (что я нашел) обобщенно изменить параметры шрифта для объектов geom_text перед созданием сюжета. Однако решение Джеймса выше отлично справилось с этим. Вместо того, чтобы использовать стандартный шрифт, я поставил FontFamily = «F», чтобы привести в пользовательском шрифте, который я выбрал в theme_min(), то есть:

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

Надеется, что это полезно для других пользователей, которые ищет, чтобы изменить шрифты их графики.

Приветствия всем, кто помог мне разобраться! Аарон

+4

(+!) Благодарит за полезный ответ; ссылка на блог нарушена. –

+1

Не то, чтобы команда 'opts' устарела в ggplot2 некоторое время. Вы должны (в основном?) Иметь возможность использовать код выше, заменив 'opts' на' theme'. Некоторые спецификации элементов, такие как 'theme_text', вероятно, должны быть изменены на' element_text' –

+0

большое использование '' 'F''' ;-) – PatrickT

11

Посмотрите на семейный аргумент 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

Отлично, спасибо Тьерри - это действительно способ изменить типы шрифтов, используя библиотеку шрифтов, входящих в стандартную библиотеку шрифтов R. Невозможно понять, как реализовать пользовательские шрифты. Будем смотреть на некоторые из этих других сообщений ... – Aaron

2

Вы можете установить шрифт меток, полученных geom_text с grid.gedit:

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

Зов это после того, как вы создали ваш оригинальный сюжет.

+0

Замечательные комментарии, все, большое вам спасибо. Брэндон, ваше предложение было прямо на цель, за исключением того, что у меня возникли проблемы с использованием метода, найденного по адресу http://johndunavent.com/combined-line-and-bar-chart-ggplot2, для изменения меток шрифтов geom_text. Джеймс, не уверен, знакомы ли вы с этим сообщением, но как я могу использовать ваше решение (которое отлично работает) для изменения шрифтов метки geom_text с помощью шрифта, который я привез в R, используя команду windowsFonts()? Спасибо за вашу помощь! Джефф, проверит Каир, если я продолжу бить кирпич здесь ... – Aaron

+0

'windowsFonts (Verdana =" TT Verdana ")', тогда вы можете использовать 'fontfamily =" Verdana "'. Вы также можете установить метки оси и заголовки с символом '' axis.text "и' "axis.title" в первом аргументе. Эта ссылка сейчас мертва кстати, но вы все равно можете получить ее через кеш Google. – James

4

Вдохновленный a post на блоге kohske «s я пришел с этим:

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()) 

Теперь, когда я хочу использовать эту конкретную тему:

last_plot() + theme_map 

YMMV.

Кстати, если бы я имел власть, я бы провалить предпочтительный ответ:

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

Не уверен, что это значит. Я также не предложил ссылку на комментарий к этому ответу; возможно, что-то изменилось на сайте.

+1

Привет, Нил, я все еще не эксперт в ggplot2, но мне кажется, что решение, которое вы придумали, хорошо работает при использовании настроек шрифта/темы, которые изначально доступны для R и ggplot2.Мне нужно было импортировать любой пользовательский шрифт из библиотеки окон для моих сюжетов, а решение, которое Брэндон и Джеймс помогли мне придумать работы красиво. Вот как я использую grid.gedit: 'windowsFonts (F = windowsFont (chartFont))' 'grid.gedit (" GRID.text ", gp = gpar (fontfamily =" F "))' Вам нужно убедиться, что Семейство шрифтов, которое вы хотите, доступно. – Aaron

+0

@NeilBest Ошибка означает, что у вас нет текстовых слоев в вашем заговоре, т. Е. Не используется 'geom_text' – James

+1

Это больше не работает (по крайней мере, для меня). Но обходной путь, который работает, это: 'theme_map $ text $ family = 'new font'' – geotheory

27

Я думаю, ваш ответ хорошо, но вы можете сделать это более просто:

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

, похоже, не работает на' 'annotate()' 'font ...? – PatrickT

+0

Насколько я могу судить, для '' annotate() '' вам нужно предоставить информацию о шрифте, например. '' family = myfamily, fontface = myfontface'', где '' myfamily'' и '' myfontface'' должны соответствовать тому, что передается '' theme() '' в соответствии с вашим подходом. Немного неприятности, если у вас есть несколько вызовов '' annotate() ''. Я не проверял, но я не думаю, что ответ выше относится к '' annotate() '. – PatrickT

0

Это кажется самым простым решением, за свои деньги.

Некоторые данные играют в ФР, и сделал в простой графе «р», с хорошими длинными х и у меток, поэтому мы можем видеть изменение шрифта:

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") 

И мы рассматриваем сюжет по умолчанию в какой бы этот шрифт:

p 

Теперь мы переходим к Optima, добавив некоторые интересные заголовок и подзаголовок, чтобы погреться в лучах славы Optima:

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

И после всего этого, мы выводим в новом шрифте

# 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

+1

Эй, @tim, ggplot2 поставляется со встроенными параметрами шрифтов. Этот вопрос касается ситуаций, когда вы хотите импортировать шрифты, недоступные в ggplot2, из вашей системы. – Aaron

Смежные вопросы