I am having a problem of getting Fontawesome5 to work in R. I have installed the latest version of R, and therefore all have updates all the packages used as well, and I can't get the font to work in R. It is used to make info graphics, see the website here: https://www.listendata.com/2019/06/create-infographics-with-r.html
Once I upload the ttf. files into R i get this error message:
In grid.Call.graphics(C_text, as.graphicsAnnot(x$label), ... :
font family 'FontAwesome5Free-Solid' not found, will use 'wqy-microhei' instead
This means that I get a plot back with no font in it, just a dot. (see picture) [R plot without font1
It would appear R can't put Fontawesome5(5th version) onto the ggplot2/pdf. Is there a way to make this font work in R with ggplot?, regards James.
library(ggplot2)
library(waffle)
library(extrafont)
library(tidyverse)
library(echarts4r)
library(echarts4r.assets)
install.packages("extrafontdb", repos = "http://cran.rstudio.com/")
library(extrafont)
#font download: https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf
extrafont::font_import (path="C:/file/location/Documents/R", pattern = "awesome", prompt = FALSE)
install_fa_fonts()
extrafont::font_import (path="C:/Users/User/Documents/R/win-library/4.0/waffle/fonts") #path is where R installs file:
loadfonts(device = "win") #loads in fonts
fonts()[grep("Awesome", fonts())] # should say Awesome fonts 5 in installed.
waffle(
c(`Poor=10` =10, `Average=18` = 18, `Excellent=7` =7), rows = 5, colors = c("#FD6F6F", "#93FB98", "#D5D9DD"),
use_glyph = "female", glyph_size = 12 ,title = 'Girls Performance', legend_pos="bottom"
)
This happened to me after I had updated my Mac OS to Catalina. After weeks of research (and minutes after I had commented on your post here), I found a solution that at least worked for me.
It seems (but please correct me if I'm wrong) that the R package extrafont can only deal with .ttf font files. And it seems like Catalina converted my fonts to .ttc, so I had to convert these back into .ttf and copy paste these .ttf into the System fonts folder.
In short, convert your fonts from .ttc to .ttf
Similar to what they figured out here:
https://github.com/wch/extrafont/issues/32
I used transfonter.org to convert my fonts.
Related
I'm trying to make a square pie with waffle function but the male icon can't be used
library(waffle)
library(extrafont)
parts <- c(`Sick=14` =14, `Treated=19` = 19, `Not sick=7` =7)
loadfonts(device = "win")
system.file("fonts", package="waffle")
waffle(
parts, rows = 5, colors = c("#FD6F6F", "#93FB98", "#D5D9DD"),
use_glyph = "male", size = 8 ,title = 'convenient title'
)
Thank you .
This is most likely to a funky installation of Font Awesome. There are many version with various names around. Check that you have "FontAwesome" installed with the following command:
> fonts()[grep("Awesome", fonts())]
[1] "FontAwesome"
then you should be able to get this:
What worked for me was following all these instructions (https://www.listendata.com/2019/06/create-infographics-with-r.html) BUT installing the FontAwesome package 4.7 that you can download here (https://fontawesome.com/versions). Otherwise I think it seems newer packages have a different font/family name (Free Reegular version whatever) that waffle can not read.
I would say main points are:
Add FontAwesome 4.7. font (.ttf) to your computer clicking on the .ttf file in the package once unzipped.
Make sure you remove other versions of FontAwesome from your computer and from the fonttable of extrafont (https://stackoverflow.com/a/70386036/4438465)
Make sure you also add the font with the font_add option in showtext package (see step 7 in the first link from listendata).
I am building a map in R that I would like to have the text to be shown in Linux Libertine font. Package extrafont is loaded, fonts have been loaded and the path to ghostscript is correctly set.
When I use the following command, R saves the output and everything works fine.
ggsave(file = foo.eps, plot = map, width = 15, height = 10, units = "cm", family='Linux Libertine Display')
However when I instead use family='Linux Libertine', I receive the following error message:
Error in grDevices::postscript(..., onefile = FALSE, horizontal = FALSE, :
unknown family 'Linux Libertine'
It seems that it can't find the font, which is weird as it is listed in the return of fonttable(). Any ideas how I can make R to use the font?
The link provided by user TomNash does indeed explain the problem and the solution:
The problem is that some fonts (and this includes Linux Libertine) have distinct font face names (Linux Libertine Bold, Linux Libertine Italics, etc.) but all share the same family name (Linux Libertine). The extrafont package cannot distinguish between those fonts, because it only looks at the family name (and in the above example Linux Libertine Display works, because this is a unique family name).
The easiest way to fix this is to locate the directory of the font table: system.file("fontmap", "fonttable.csv", package="extrafontdb") and then open the fonttable.csv and copy for all Linux Libertine fonts (or whatever fonts this concerns) the font name into the font family cell. Then return to R and execute loadfonts() again to make sure R rebuilds the font table.
I am trying to embed a .eps file for a journal publication requirements.
I create my plot using ggplot2:
p=ggplot(data=sim, aes(x=TIME,y=DV,group=ID))+
theme_few()+
geom_point(aes(shape=as.factor(SEASON2)),size=3,fill="white")+
geom_point(aes(color=as.factor(AGE2),shape=as.factor(SEASON2)),size=3,fill="white",show_guide=F)+
scale_shape_manual(name="Season",values=c(25,24))+
geom_line(aes(color=as.factor(AGE2),linetype=as.factor(MODEL2)),size=0.75)+
scale_linetype_manual(name="Model [Population]",values=c("dotted","solid"))+
scale_color_manual(name="Age",values=as.vector(c(ggthemes_data$few$medium[5],ggthemes_data$few$medium[4])))+
theme(legend.position="bottom",legend.direction="vertical",legend.box="horizontal")+
guides(color=guide_legend(order=1), shape=guide_legend(order=2), linetype=guide_legend(order=3))+
xlab("Clock time [hours]")+
ylab("Testosterone levels [ng/dL]")+
geom_hline(yintercept=300,linetype="dashed",color="black")
print(p)
And then, I generate the .eps
postscript(file.path(directory,"Script","Figure5.eps"),
width=10,
height=12.25,
paper="a4",
horizontal=T,
onefile=TRUE)
print(p)
dev.off()
This .eps was not accepted for the online application when I tried to submit the plot because I have to make the fonts available to ADQ Advisor.
In order to do that I used:
install.packages("extrafont")
library("extrafont")
font_import()
fonts()
loadfonts(device = "postscript") ## for postscript()
embed_fonts("./Figure5.eps", outfile = "./Figure5-embed.eps", options = "-dEPSCrop")
embedFonts(file="Figure5.eps",
outfile="Figure5EMB.eps",
options="-dEPSCrop")
Both of these functions failed and gave me the following error:
Error in embedFonts(file = "Figure5.eps", outfile = "Figure5EMB.eps", :
GhostScript was not found
I have GhostScript 9.18 installed in the following path: C:\Program Files (x86)\gs\gs9.18
Any suggestions?
According to the R documentation you set the location of the Ghostscript executable to be used by R using the R_GSCMD environment variable, failing that the PATH is searched. Do you have that environment variable set or do you have the path to the Ghostscript executable added to the PATH environment variable ?
Note also this, from the R developer mailing list, and this. I have no idea why the documentation thinks there are different executables to view and manipulate PostScript/PDF files, this isn't true (though its possible you might want to use a different application, such as GSView, to view files the Ghostscript display device works as well though much more crudely).
I've installed the 'extrafont' package in order to install an external font library Duality via the ttf_import() method. However, when specifying the font via the wordcloud method, I receive the following error:
Installation command:
# Assuming the font file, DUALITY_.ttf, is in the working directory (see link to font above)
font_import(".",FALSE,pattern="DUALITY")
Wordcloud command:
wordcloud(ap.d$word, ap.d$freq, scale=c(8,2), min.freq=10, vfont=c("Duality","plain"),
random.order=FALSE, rot.per=0, use.r.layout=FALSE, colors=pal2, fixed.asp=FALSE)
Output:
Error in strwidth(words[i], cex = size[i], ...) :
invalid 'vfont' value [typeface -2147483648]
In order to verify that the font is indeed installed, I issued the following commands
> choose_font("Duality")
[1] "Duality"
> fonts()
....[49] "Waree" "Duality"
How come the Duality font is not visible to the vfont parameter of wordcloud? And how do I make it visible to Cairo (the default renderer). TIA!
I've been able to overcome the same problem using the parameters passed to text family and font and described in ?par instead of vfont. Also I needed to load the font first. So the thing goes:
Import the font (sorry, the link to Duality provided in OP is no longer available, I use Lucida Handwriting instead, available in windows):
library(extrafont)
font_import(pattern="LHANDW")
Load (see this blog for details):
loadfonts() # loadfonts(device = "win") if you are working in windows
Wordcloud:
wordcloud(ap.d$word, ap.d$freq, scale=c(8,2), min.freq=10, family="Lucida Handwriting", font=1,
random.order=FALSE, rot.per=0, use.r.layout=FALSE, colors=pal2, fixed.asp=FALSE)
To complement previous answers, and explain how one can actually choose which fonts to use. First, import fonts (it is possible to set a path different from the default in font_import()
library(extrafont)
font_import(prompt = FALSE)
To know which fonts are available:
unique(fonttable()$FamilyName)
This presents the exact reference for what to include as "font family". You can then issue the wordcloud command like this:
wordcloud(c(letters, LETTERS, 0:9), seq(1, 1000, len = 62), family = "Carlito", font = 1)
Why font = 1? From ?par(), here's what it says about the font parameter:
An integer which specifies which font to use for text. If possible,
device drivers arrange so that 1 corresponds to plain text (the
default), 2 to bold face, 3 to italic and 4 to bold italic.
I can't set my fonts in geom_text. Here is what I tried:
labels_test<-data.frame(a=c("a","b","c"),b=c(1:3),c=c(3:1))
# works
ggplot () + geom_text(data=labels_test,aes(b,c,label=a),color="blue")
# does not work:
ggplot () + geom_text(data=labels_test,aes(b,c,label=a),color="blue",family="Times")
# error message: In grid.Call.graphics(L_text, as.graphicsAnnot(x$label), x$x, x$y,:
# Font family not found in Windows font database
I already imported all fonts as indicated here. Any ideas what is still going wrong?
The other answers didn't solve my problem (Windows 10).
The key for my system was to call extrafont::loadfonts(device="win") prior to library(ggplot2).
extrafont::loadfonts(device="win")
#extrafont::fonttable()
#extrafont::font_import("C:/Windows/Fonts/", pattern = "RobotoCondensed")
library(ggplot2)
Common problem with font locations:
I had installed the fonts from a random folder with extrafont::font_import() previously. As such extrafont::fonttable() referenced the files in my C:\Windows\Fonts\ folder. To fix this I reset my extrafonts::fonttable() with install.packages("extrafontdb") in order to clear a reference to the fonts in a different location.
Edit regarding saving:
Deeper down the rabbit hole. Saving was an additional challenge. In order to extrafont::loadfonts(device="pdf") I had to make sure no fonts in my extrafont::fonttable() had identical family names and bold/italic status. I edited extrafont:::fonttable_file() to resolve any duplicate bold/italic fonts within my family. Using Roboto Condensed I renamed the light fonts' font family to "Roboto Condensed Light".
Saving with ggsave(device="pdf") then worked. Opening the files in acrobat the fonts did not display correctly. I tried embedding the fonts with ghostscript as well as using the cairo_pdf device. The easiest and most functional solution was to open the .pdf files in Illustrator (the fonts display fine there) and immediately re-save them again as .pdf.
Edit 2 regarding saving:
Saving as .eps was the only way to preserve the file in both illustrator and acrobat. The result is perfect. ggsave(g, file="Figure.eps", fonts=c("FONT FAMILIES USED", "Roboto Condensed", "Roboto Condensed Light"))
Final plotting code:
Here is my final set of calls I use before plotting. Comments are setup commands that need to be run once only.
# Plotting
extrafont::loadfonts(device="pdf")
extrafont::loadfonts(device="postscript")
# extrafont::font_import("C:/Windows/Fonts/", pattern = "RobotoCondensed", prompt = F)
# extrafont::fonttable()
# C:/Program Files/R/R-3.3.1/library/extrafontdb/fontmap/ - Change lights to "Roboto Condensed Light"
# After ggsave(device="pdf") or ggsave(device="eps") open and resave the file in Illustrator
library(hrbrthemes)
library(ggplot2)
I would try"
windowsFonts(Times=windowsFont("TT Times New Roman"))
In doing this your specifying explicitly the Windows Font mapping.
You must import the system fonts using the command:
font_import(paths = NULL, recursive = TRUE, prompt = TRUE,pattern = NULL)
I tried the different solutions here but none worked for me (win10, R 3.4.3).
This is what worked for me:
install.packages("extrafont")
library(extrafont)
loadfonts(device = "win")
It did not matter if I did it before or after library(ggplot2)
Sources:
https://cran.r-project.org/web/packages/extrafont/extrafont.pdf
Changing fonts in ggplot2