Zmiana rozmiaru czcionki i kierunku tekstu osi w ggplot2

188

Rysuję wykres ze zmienną kategorialną na osi x i zmienną numeryczną na osi y.

W przypadku osi x, biorąc pod uwagę, że istnieje wiele punktów danych, domyślne formatowanie tekstu powoduje, że etykieta każdego znacznika nachodzi na inne etykiety. Jak (a) zmienić rozmiar czcionki dla tekstu mojej osi i (b) zmienić orientację tekstu, aby tekst był prostopadły do ​​osi?

Anjan
źródło
I jeszcze jeden stackoverflow.com/q/8097642/1172302
Nikos Alexandris
To nakłada się na stackoverflow.com/q/1330989/946850 , ale to pytanie nie obejmuje zmiany rozmiaru tekstu.
krlmlr

Odpowiedzi:

292

Użyj theme():

d <- data.frame(x=gl(10, 1, 10, labels=paste("long text label ", letters[1:10])), y=rnorm(10))
ggplot(d, aes(x=x, y=y)) + geom_point() +
    theme(text = element_text(size=20),
        axis.text.x = element_text(angle=90, hjust=1)) 
#vjust adjust the vertical justification of the labels, which is often useful

wprowadź opis zdjęcia tutaj

Jest wiele dobrych informacji na temat formatowania ggplots tutaj . Możesz zobaczyć pełną listę parametrów, które możesz zmodyfikować (w zasadzie wszystkie) za pomocą ?theme.

Drew Steen
źródło
2
Myślę, że tak powinno być hjust=1.
Artem Sokolov
Prawdziwe! Poprawiono według komentarza Artema, ale nie zaktualizowałem obrazu.
Drew Steen,
67

Ditto @Drew Steen o użyciu theme(). Oto typowe atrybuty kompozycji dla tekstu osi i tytułów.

ggplot(mtcars, aes(x = factor(cyl), y = mpg))+
  geom_point()+
  theme(axis.text.x = element_text(color = "grey20", size = 20, angle = 90, hjust = .5, vjust = .5, face = "plain"),
        axis.text.y = element_text(color = "grey20", size = 12, angle = 0, hjust = 1, vjust = 0, face = "plain"),  
        axis.title.x = element_text(color = "grey20", size = 12, angle = 0, hjust = .5, vjust = 0, face = "plain"),
        axis.title.y = element_text(color = "grey20", size = 12, angle = 90, hjust = .5, vjust = .5, face = "plain"))
metasequoia
źródło
19

Użyj theme ():

d <- data.frame(x=gl(10, 1, 10, labels=paste("long text label ", letters[1:10])), y=rnorm(10))
ggplot(d, aes(x=x, y=y)) + geom_point() +
theme(text = element_text(size=20))
meduvigo
źródło
19

Dodając do poprzednich rozwiązań, możesz również określić rozmiar czcionki w stosunku do base_sizezawartych w motywach, takich jak theme_bw()(gdzie base_sizejest 11) za pomocą rel()funkcji.

Na przykład:

ggplot(mtcars, aes(disp, mpg)) +
  geom_point() +
  theme_bw() +
  theme(axis.text.x=element_text(size=rel(0.5), angle=90))
Megatron
źródło
5

Przy tworzeniu wielu wykresów sensowne jest ustawienie go globalnie (odpowiednia część to druga linia, trzy linie razem to działający przykład):

   library('ggplot2')
   theme_update(text = element_text(size=20))
   ggplot(mpg, aes(displ, hwy, colour = class)) + geom_point()
JJ dla przejrzystości i Moniki
źródło
4

Użycie atrybutu „fill” pomaga w takich przypadkach. Możesz usunąć tekst z osi za pomocą element_blank()i wyświetlić wielokolorowy wykres słupkowy z legendą. Planuję częstotliwość usuwania części w warsztacie, jak poniżej

ggplot(data=df_subset,aes(x=Part,y=Removal_Frequency,fill=Part))+geom_bar(stat="identity")+theme(axis.text.x  = element_blank())

Wybrałem to rozwiązanie w moim przypadku, ponieważ miałem wiele słupków na wykresie słupkowym i nie byłem w stanie znaleźć odpowiedniego rozmiaru czcionki, który byłby zarówno czytelny, jak i wystarczająco mały, aby się nie nakładały.

użytkownik131476
źródło
0

Innym sposobem radzenia sobie z nakładającymi się etykietami jest użycie guide = guide_axis(n.dodge = 2).

library(dplyr)
library(tibble)
library(ggplot2)

dt <- mtcars %>% rownames_to_column("name") %>% 
  dplyr::filter(cyl == 4)

# Overlapping labels
ggplot(dt, aes(x = name, y = mpg)) + geom_point()

wprowadź opis zdjęcia tutaj

ggplot(dt, aes(x = name, y = mpg)) + geom_point() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2))

wprowadź opis zdjęcia tutaj

HBat
źródło