2016-11-14 41 views
14

przypadku złożenia ostatecznej Artykuł I zostały poproszone, aby zaktualizować swoje dane, tak aby spełniać następujące wymagania:Jak uzyskać dokładne rozmiary czcionek, linii, punktów i figur w ggplot2?

  1. linie osi są 0,25 mm
  2. linie osi dookoła z kleszczy stoi w
  3. linii danych wynosi 0,5 mm
  4. czcionki 10pt
  5. dane powinny być 80 lub 169 mm, szerokości
  6. musi wynosić 300 dpi

Co próbowałem:

library(ggplot2) 
library(cowplot) 
theme_set(theme_bw()) 

x <- rnorm(100) 
mydata <- data.frame(x = x, 
        y = x^2 + runif(100), 
        z = rep(letters[1:4], 25)) 

p <- ggplot(data = mydata, aes(x, y)) + 
    geom_point(aes(color = z)) + 
    geom_smooth(color = 'black', se = FALSE, size = 0.5) + 
    theme(text = element_text(family = 'Times', size = 10, color = 'black'), 
     axis.ticks.length = unit(-0.1, 'cm'), 
     axis.text.x = element_text(margin = margin(t = 4, unit = 'mm')), 
     axis.text.y = element_text(margin = margin(r = 4, unit = 'mm')), 
     panel.grid = element_blank(), 
     axis.line = element_line(size = 0.25), 
     legend.position = c(0.5, 0.75)) 

p 
ggsave(plot = p, 
     filename = 'myplot.png', 
     width = 80, height = 50, dpi = 300, units = 'mm') 

p2 <- cowplot::plot_grid(plotlist = list(p, p, p, p), nrow = 1) 
ggsave(plot = p2, 
     filename = 'mymultipleplot.png', 
     width = 169, height = 50, dpi = 300, units = 'mm') 

która zwraca następujące dwie działki:

enter image description here

enter image description here

mogę dowiedzieć się, jak radzić sobie w niektórych kwestiach tutaj (na przykład Pozycje legendy), ale mam problemy z następujących czynności:

  1. Jak mogę uzyskać kleszczy wokół górnej i prawej osi?
  2. Jak mogę uzyskać prawidłowe rozmiary ...
    • Wyglądają one znacznie większe niż 10 pkt. (pobierz je lub otwórz w nowym oknie, aby zobaczyć wersję nieskalowaną)
    • Rozmiary nie są zachowane na dwóch figurach, mimo że zostały określone w motywie (czcionka, linia).
    • Nie wiem, jak potwierdzić, że linie mają prawidłowy rozmiar (w punktach lub mm) ... czy ggsave ma własne skalowanie?

aktualizacja Dla mojego obecnego zadania I eksportowane jako pliki SVG i edytowanej je w Inkscape. Zajęło to kilka godzin, ale było łatwiejsze, niż uzyskanie ggplota, by wykręcić się do specyfikacji.

Ale byłoby pomocne wiedzieć na przyszłość, jak to zrobić programowo w ggplot2.

+6

Na pytanie 1 (Jak mogę uzyskać kleszczy wokół górnej i prawej osi?), Zobaczyć nowe 'sec.axis' argument' scale_ 'in [ggplot 2.2.0] (https://blog.rstudio.org/2016/11/14/ggplot2-2-2-0/). Spróbuj na przykład 'ggplot (mpg, aes (displ, hwy)) + geom_point() + scale_x_continuous (sec.axis = dup_axis()) + scale_y_continuous (sec.axis = dup_axis())'. – Henrik

+0

Dla mnie wygląda na to, że etykiety osi "x" i "y" są tuż za 10 pkt, a cały tekst jest mniejszy. Przy rozdzielczości 300 dpi (ppi), 10 punktów to 10/72 * 300 pikseli lub około 42 pikseli. – mvkorpel

+0

Powinieneś dokładniej opisać, co masz na myśli, ponieważ rozmiary nie są utrzymywane na dwóch figurach. Szerokości linii i rozmiary czcionek wydają się być takie same na obu rysunkach. – mvkorpel

Odpowiedz

0

odpowiedź na pytanie: 1) Henrik powiedział w komentarzach:

Na pytanie 1 (Jak mogę uzyskać kleszczy wokół górnej i prawej osi), zobaczyć nowy sec.axis argument w scale_ w? ggplot 2.2.0. Spróbuj na przykład ggplot (MPG, AES (DISPL, Highway)) + geom_point() + scale_x_continuous (sec.axis = dup_axis()) + scale_y_continuous (sec.axis = dup_axis())

2) problemem jest to, że masz tę samą rozdzielczość w różnych rozmiarach. Ponieważ wysokość obu rysunków jest taka sama, możesz rozwiązać ten problem, skalując rozmiar czcionki, mnożąc rozmiar czcionki ze współczynnikiem szerokości: np.

theme(text = element_text(family = 'Times', size = 10*(80/169), color = 'black') 

Cały kod powinien wyglądać tak:

library(ggplot2) 
library(cowplot) 
theme_set(theme_bw()) 

x <- rnorm(100) 
mydata <- data.frame(x = x, 
        y = x^2 + runif(100), 
        z = rep(letters[1:4], 25)) 

p1 <- ggplot(data = mydata, aes(x, y)) + 
    geom_point(aes(color = z)) + scale_x_continuous(sec.axis = dup_axis()) + 
    scale_y_continuous(sec.axis = dup_axis()) + 
    geom_smooth(color = 'black', se = FALSE, size = 0.5) + 
    theme(text = element_text(family = 'Times', size = 10*(80/169), color = 'black'), 
     axis.ticks.length = unit(-0.1, 'cm'), 
     axis.text.x = element_text(margin = margin(t = 4, unit = 'mm')), 


     axis.text.y = element_text(margin = margin(r = 4, unit = 'mm')), 

     panel.grid = element_blank(), 
     axis.line = element_line(size = 0.25), 
     legend.position = c(0.5, 0.75)) 

p2 <- ggplot(data = mydata, aes(x, y)) + 
    geom_point(aes(color = z)) + scale_x_continuous(sec.axis = dup_axis()) + 
    scale_y_continuous(sec.axis = dup_axis()) + 
    geom_smooth(color = 'black', se = FALSE, size = 0.5) + 
    theme(text = element_text(family = 'Times', size = 10, color = 'black'), 
     axis.ticks.length = unit(-0.1, 'cm'), 
     axis.text.x = element_text(margin = margin(t = 4, unit = 'mm')), 


     axis.text.y = element_text(margin = margin(r = 4, unit = 'mm')), 

     panel.grid = element_blank(), 
     axis.line = element_line(size = 0.25), 
     legend.position = c(0.5, 0.75)) 


p1 
ggsave(plot = p1, 
     filename = 'myplot.png', 
     width = 80, height = 50, dpi = 300, units = 'mm') 

p2multi <- cowplot::plot_grid(plotlist = list(p2, p2, p2, p2), nrow = 1) 

ggsave(plot = p2multi , 
     filename = 'mymultipleplot.png', 
     width = 169, height = 50, dpi = 300, units = 'mm')