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))
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:
Powyższy obrazek pochodzi z tego posta na blogu.
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))
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()
A teraz super długie tytuły są rozłożone poziomo i bardzo łatwe do odczytania!
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:
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