Etykiety z osiami obrotowymi i odstępowymi w ggplot2

Mam wykres, gdzie oś x jest czynnikiem, którego etykiety są długie. Chociaż prawdopodobnie nie jest to idealna wizualizacja, na razie chciałbym po prostu obrócić te etykiety tak, aby były pionowe. Rozgryzłem tę część za pomocą poniższego kodu, ale jak widać, etykiety nie są całkowicie widoczne.

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + opts(axis.text.x=theme_text(angle=-90))

Tutaj wpisz opis obrazka

Author: amonk, 2009-08-26

4 answers

Zmień ostatnią linię na

q + theme(axis.text.x = element_text(angle = 90, hjust = 1))

Domyślnie, osie są wyrównane na środku tekstu, nawet po obróceniu. Gdy obracasz + / - 90 stopni, Zwykle chcesz, aby był wyrównany na krawędzi:

alt text

Powyższy obrazek pochodzi z tego posta na blogu.

 806
Author: Jonathan Chang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 14:14:45

Aby tekst na etykietach tick był w pełni widoczny i odczytywany w tym samym kierunku, co etykieta na osi y, Zmień ostatnią linię na

q + theme(axis.text.x=element_text(angle=90, hjust=1))
 67
Author: e3bo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-24 05:03:25

Użyj + coord_flip().

W "R jak Data Science" Wickham i Grolemund mówią dokładnie o tym problemie. W rozdziale 3.8, korekty pozycji , piszą:

coord_flip() przełącza osie x i Y. Jest to przydatne (na przykład), jeśli chcesz poziome boxplots. Jest to również przydatne w przypadku długich etykiet: trudno je dopasować bez nakładania się na oś X.

Stosując to do swojej działki, dodajemy + coord_flip() do ggplot:

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))

qplot(cut,carat,data = diamonds, geom = "boxplot") +
  coord_flip()

Tutaj wpisz opis obrazka

A teraz super długie tytuły są rozłożone poziomo i bardzo łatwe do odczytania!

 45
Author: Rich Pauloo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 06:10:14

Chciałbym przedstawić alternatywne rozwiązanie, solidne rozwiązanie podobne do tego, co zamierzam zaproponować, było wymagane w najnowszej wersji ggtern, od wprowadzenia funkcji obracania płótna.

Zasadniczo, musisz określić względne pozycje za pomocą trygonometrii, budując funkcję, która zwraca obiekt element_text, dany kąt (tj. stopnie) i położenie (tj. jeden z x,y,Góra lub prawo) informacji.

#Load Required Libraries
library(ggplot2)
library(gridExtra)

#Build Function to Return Element Text Object
rotatedAxisElementText = function(angle,position='x'){
  angle     = angle[1]; 
  position  = position[1]
  positions = list(x=0,y=90,top=180,right=270)
  if(!position %in% names(positions))
    stop(sprintf("'position' must be one of [%s]",paste(names(positions),collapse=", ")),call.=FALSE)
  if(!is.numeric(angle))
    stop("'angle' must be numeric",call.=FALSE)
  rads  = (angle - positions[[ position ]])*pi/180
  hjust = 0.5*(1 - sin(rads))
  vjust = 0.5*(1 + cos(rads))
  element_text(angle=angle,vjust=vjust,hjust=hjust)
}
Szczerze mówiąc, moim zdaniem uważam ,że "auto" opcja powinna być udostępniona w {[3] } dla argumentów hjust i vjust, przy określaniu kąta, w każdym razie pokażmy jak działa powyższe.
#Demonstrate Usage for a Variety of Rotations
df    = data.frame(x=0.5,y=0.5)
plots = lapply(seq(0,90,length.out=4),function(a){
  ggplot(df,aes(x,y)) + 
    geom_point() + 
    theme(axis.text.x = rotatedAxisElementText(a,'x'),
          axis.text.y = rotatedAxisElementText(a,'y')) +
    labs(title = sprintf("Rotated %s",a))
})
grid.arrange(grobs=plots)

, która daje:

Przykład

 20
Author: Nicholas Hamilton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-02 12:39:36