2017-09-01 3 views
1

Ich habe Ratschläge, die ich online für das Speichern eines ggplot-Diagramms in PDF gefunden habe, aber ich kann es nicht richtig funktionieren. Ich verwende das extrafont-Paket, um Diagramme mit Text in Calibri zu erstellen, aber meine Diagramme werden ohne Text ausgedruckt. Ich weiß nicht, was ich vermisse. Ich kann in meinem Prozess keine Fehler finden. Hoffentlich kann jemand anderes helfen.Speichern ggplot Grafik in PDF mit Schriftarten eingebettet in r

Hier ist der Code und Verfahren I verwendet:

library(extrafont) 
font_import(pattern="[C/c]alibri") 
loadfonts(device="win") 

ich Ghostscript zu diesem Zeitpunkt installiert. Führen Sie dann Folgendes aus, um den GhostScript-Speicherort festzulegen.

Sys.setenv(R_GSCMD = "C:\\Program Files\\gs\\gs9.21\\bin\\gswin64c.exe") 

Ich produzierte dann ein Diagramm mit ggplot namens "Diagramm". Das Diagramm sah in RStudio perfekt aus, aber nicht in PDF.

ggsave("chart.pdf", plot = chart, width = 6, height = 4) 

Hier bekomme ich Warnungen zeigen, Sachen wie diese:

In grid.Call (C_textBounds, as.graphicsAnnot (x $ label), ...: Schriftfamilie 'Calibri' nicht gefunden in Postscript-Schriftdatenbank

Offenbar sind diese Warnungen geschehen soll? Dann laufe ich ...

embed_fonts("chart.pdf", outfile="chart_embed.pdf") 

Leider sieht das endgültige "Einbetten" Diagramm nicht anders aus als das ursprüngliche Diagramm, von dem keiner Text hat.

Falls es hilft, hier ist der Code, um das Diagramm zu produzieren:

a <- ggplot(data=stats, aes(x=Date)) 
Chart <- a + geom_point(aes(y=NevadaTotalNonfarmAllEmployees)) + 
     xlab("Date") + 
     ylab("Nonfarm Jobs") + 
     ggtitle("Nevada Total Jobs") + 
     theme(axis.title.x = element_text(size=15, family = "Calibri"), 
      axis.title.y = element_text(size=15, family = "Calibri"), 
      axis.text.x = element_text(size=10, family = "Calibri"), 
      axis.text.y = element_text(size=10, family = "Calibri"), 
      plot.title = element_text(hjust=0.5, size=20, family = "Calibri")) 

Ich habe versucht, meine Haare worden ziehen um dies herauszufinden. Oder ist es nicht der Code, sondern etwas anderes? So oder so, danke für jede Hilfe.

+0

Ich bemerkte, dass die Höhe und Breite in ggsave Wechsel() geholfen. Jetzt gibt es Buchstaben als nächstes auf der Karte, aber es ist alles auf einer Stelle getippt. Es sind also alle Buchstaben, die über sich selbst geschrieben sind. Zum Beispiel hat der Titel alle seine Buchstaben zentriert auf einer Stelle, so dass das Wort nicht lesbar ist. Es scheint sich um ein Dimensionierungsproblem zu handeln. Hat jemand irgendwelche Tipps zum Sizing? – trijamms

+2

Sie können einige Eingaben für das Thema speichern: 'theme (text = element_text (family =" Calibri "), axis.text = element_text (größe = 10), axis.title = element_text (größe = 15), plot .title = element_text (hjust = 0.5, size = 20)). – eipi10

+0

Das ist nützlich. Danke eipi10! – trijamms

Antwort

0

Ich glaube, Sie haben den Initialisierungsschritt font_import() verpasst. Seien Sie vorgewarnt, die Ausführung dieses Befehls kann etwas länger dauern.

Zunächst können Sie sehen, welche Schriftarten Sie mit dem Befehl windowsFonts() zur Verfügung haben. Die aktuellen Schriftarten in meinem Grafikgerät sind;

$serif 
[1] "TT Times New Roman" 

$sans 
[1] "TT Arial" 

$mono 
[1] "TT Courier New" 

Danach können Sie die extrafont Bibliothek und die loadfonts(device = "win") importieren. Ich empfehle auch, diese Befehle in der R-Konsole und nicht in RStudio auszuführen. Ich schlage das vor, weil beim Importieren der Schriftarten mit font_import() in RStudio möglicherweise die Eingabeaufforderung y/n nicht angezeigt wird.

Unten gebe ich ein Minimum reproduzierbares Beispiel;

library(ggplot2) 
    library(extrafont) 
    font_import() 
    # tell where ghostscript is located. This is required for saving the font in pdf 
    Sys.setenv(R_GSCMD = "C:\\Program Files\\gs\\gs9.21\\bin\\gswin64c.exe") # I have installed 64-bit version of GhostScript. This is why I've used gswin64c.exe. If you have installed 32-bit version of GhostScript, use gswin32c.exe. Failure to specify the correct installed GhostScript will yield error message, "GhostScript not found" 
    # create a plot object 
p <- ggplot(mtcars, aes(x=wt, y=mpg)) + 
    geom_point()+ 
    ggtitle("Fuel Efficiency of 32 Cars")+ 
    xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") + 
    theme_bw()+ 
    theme(text=element_text(family="ArialMT", size=14)) 
# show the plot 
print(p) 

plot

# save the plot as pdf 
ggsave("figures//ggplot_arialmt.pdf", p, width=20, height=20, 
    device = "pdf", units = "cm") 

Hinweis

Es ist nur die ArialMT Schriftart, die mit ggsave() scheint zu funktionieren.Siehe hierzu SO post. Wenn Sie eine andere Schriftart zum Speichern in PDF verwenden, wird die Figur mit Zeichen übereinander dargestellt. Dies ist auch ein open issue für ggsave und wird nicht beantwortet seit 2013

0

ich gefunden habe, ist es sicherer, explizit Schriftarten registriert mit pdfFonts (und/oder postscriptFonts). Die Dokumentation enthält ein Beispiel, aber werfen Sie auch einen Blick auf meine fonts module. Damit ist eine neue Schriftart Registrierung so einfach wie das Schreiben

fonts$register_font('Calibri') 

Intern dies schafft eine Schriftart wie mit Type1Font, stellt sicher, dass die Namen richtig eingestellt sind, und ruft pdfFonts.

Es stellt auch sicher, dass der komplette Satz von Schriftmetriken vorhanden ist (was mit extrafont::ttf_import erfolgt).

Dieser Weg ist erheblich schneller als das Generieren von Schriftmetriken für alle Schriftarten mit font_import und gibt Ihnen mehr Kontrolle.

0

Hier gibt es ein paar Probleme: (1) Laden von Schriftarten in R und (2) Verwenden einer PDF-schreibenden Bibliothek, die ordnungsgemäß mit benutzerdefinierten eingebetteten Schriftarten funktioniert.

Zuerst wie andere schon erwähnt haben, unter Windows benötigen Sie in der Regel extrafont::font_import() registrieren viele Ihre Systemschriften mit R laufen, aber es kann eine Weile dauern, und TTF und andere Arten von Schriften verpassen. Ein Weg, um dies Schriften in R on the fly zu laden, ohne die vollständige Datenbank geladen, windowsFonts(name_of_font_inside_r = windowsFont("Name of actual font")) verwenden, etwa so:

windowsFonts(Calibri = windowsFont("Calibri")) 

Dies macht nur, dass eine Schriftart zugänglich in R. können Sie mit windowsFonts() überprüfen. Sie müssen diese Zeile jedes Mal ausführen, wenn das Skript ausgeführt wird - das Laden der Schriftart wird nicht zwischen den Sitzungen fortgesetzt. Sobald die Schriftart geladen ist, können Sie es normalerweise verwenden:

library(tidyverse) 
df <- data_frame(x = 1:10, y = 2:11) 

p <- ggplot(df, aes(x = x, y = y)) + 
    geom_point() + 
    labs(title = "Yay Calibri") + 
    theme_light(base_family = "Calibri") 
p 

Calibrified

Zweite, R integrierten PDF-Schreibgerät sowohl unter Windows und Mac OS Schrift nicht verarbeitet sehr gut Einbettung . R enthält jedoch jetzt die Cairo-Grafikbibliothek, die Schriften gut einbetten kann. Sie können das Kairo-Gerät in ggsave() angeben, es zu benutzen, die mit Ghostscript als Umgang einfacher ist:

ggsave(p, filename = "whatever.pdf", device = cairo_pdf, 
     width = 4, height = 3, units = "in") 
Verwandte Themen