Memutar dan memberi jarak pada label sumbu di ggplot2

671

Saya punya plot di mana sumbu x adalah faktor yang labelnya panjang. Walaupun mungkin bukan visualisasi yang ideal, untuk saat ini saya hanya ingin memutar label ini menjadi vertikal. Saya telah menemukan bagian ini dengan kode di bawah ini, tetapi seperti yang Anda lihat, labelnya tidak sepenuhnya terlihat.

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))

masukkan deskripsi gambar di sini

Christopher DuBois
sumber

Jawaban:

1113

Ubah baris terakhir ke

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

Secara default, sumbu disejajarkan di tengah teks, bahkan ketika diputar. Saat Anda memutar +/- 90 derajat, Anda biasanya menginginkannya agar rata di tepi:

teks alternatif

Gambar di atas adalah dari posting blog ini .

Jonathan Chang
sumber
95
Dalam versi terbaru ggplot2 perintahnya adalah: q + theme(axis.text.x=element_text(angle = -90, hjust = 0))
rnorberg
55
Bagi mereka yang tidak berperilaku seperti yang dijelaskan di sini, cobalah theme(axis.text.x=element_text(angle = 90, vjust = 0.5)). Pada ggplot2 0.9.3.1 ini tampaknya menjadi solusi.
lilster
42
Sebenarnya, saya harus menggabungkan dua solusi di atas untuk mendapatkan label yang tepat:q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
jupp0r
32
@ jupp0r benar. theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))ADALAH YANG BEKERJA SAAT INI.
51
jika Anda menginginkan label yang diputar 45 ° (lebih mudah dibaca) theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))memberikan hasil yang baik
jan-glx
89

Untuk membuat teks pada label centang terlihat dan dibaca dengan arah yang sama dengan label sumbu y, ubah baris terakhir menjadi

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

Menggunakan coord_flip()

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

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

masukkan deskripsi gambar di sini


Dalam Bab 3.9 dari R untuk Ilmu Data , Wickham dan Grolemund berbicara dengan pertanyaan yang tepat ini:

coord_flip()mengganti sumbu x dan y. Ini berguna (misalnya), jika Anda ingin plot kotak horisontal. Ini juga berguna untuk label panjang: sulit untuk membuatnya pas tanpa tumpang tindih pada sumbu x.

Pauloo yang kaya
sumber
26

Saya ingin memberikan solusi alternatif, solusi kuat mirip dengan apa yang akan saya usulkan diperlukan dalam versi terbaru ggtern , karena memperkenalkan fitur rotasi kanvas.

Pada dasarnya, Anda perlu menentukan posisi relatif menggunakan trigonometri, dengan membangun fungsi yang mengembalikan element_textobjek, sudut yang diberikan (yaitu derajat) dan posisi (yaitu salah satu informasi x, y, atas atau kanan).

#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)
}

Terus terang, menurut pendapat saya, saya berpikir bahwa opsi 'otomatis' harus dibuat tersedia ggplot2untuk hjustdan vjustargumen, ketika menentukan sudutnya, bagaimanapun, mari kita menunjukkan cara kerja di atas.

#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)

Yang menghasilkan sebagai berikut:

Contoh

Nicholas Hamilton
sumber
1
Saya tidak mendapatkan hasil yang sama, bagi saya teks sumbu tidak pernah disesuaikan dengan baik menggunakan metode otomatis Anda. Namun, menggunakan rads = (-angle - positions[[ position ]])*pi/180penempatan yang dihasilkan lebih baik. Perhatikan tanda minus tambahan sebelum sudut. Terima kasih atas kodenya :)
asac
7

The ggpubr paket penawaran shortcut yang melakukan hal yang benar secara default (Teks rata kanan, kotak Teks rata tengah untuk mencentang):

library(ggplot2)
diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))
q <- qplot(cut, carat, data = diamonds, geom = "boxplot")
q + ggpubr::rotate_x_text()

Dibuat pada 2018-11-06 oleh paket reprex (v0.2.1)

Ditemukan dengan penelusuran GitHub untuk nama-nama argumen yang relevan: https://github.com/search?l=R&q=element_text+angle+90+vjust+org%3Acran&type=Code

krlmlr
sumber
6

Atau, ggplot 3.3.0sediakan guide_axis(n.dodge = 2)(sebagai guideargumen scale_..atau xargumen untuk guides) untuk mengatasi masalah over-plot dengan menghindari label secara vertikal. Ini berfungsi dengan baik dalam hal ini:

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

ggplot(diamonds, aes(cut, carat)) + 
  geom_boxplot() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  NULL

jan-glx
sumber
1

Untuk mendapatkan label centang x yang dapat dibaca tanpa dependensi tambahan, Anda ingin menggunakan:

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

Ini memutar label centang 90 ° berlawanan arah jarum jam dan meluruskannya secara vertikal di ujungnya ( hjust = 1) dan pusatnya secara horizontal dengan tanda centang yang sesuai ( vjust = 0.5).

Contoh lengkap:

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))


Catatan, bahwa vertikal / parameter pembenaran horisontal vjust/ hjustdari element_textrelatif ke teks. Karena itu, vjustbertanggung jawab atas perataan horizontal .

Tanpa vjust = 0.5itu akan terlihat seperti ini:

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

Tanpa hjust = 1itu akan terlihat seperti ini:

q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

Jika karena alasan tertentu (kabel) Anda ingin memutar centang label 90 ° searah jarum jam (sehingga mereka dapat dibaca dari kiri) Anda akan perlu untuk menggunakan: q + theme(axis.text.x = element_text(angle = -90, vjust = 0.5, hjust = -1)).

Semua ini sudah dibahas dalam komentar dari jawaban ini tetapi saya sering kembali ke pertanyaan ini, sehingga saya ingin jawaban yang dapat saya salin tanpa membaca komentar.

jan-glx
sumber
0

Alternatif untuk coord_flip()menggunakan ggstancepaket. Keuntungannya adalah membuatnya lebih mudah untuk menggabungkan grafik dengan jenis grafik lainnya dan Anda dapat, mungkin lebih penting, mengatur rasio skala tetap untuk sistem koordinat Anda .

library(ggplot2)
library(ggstance)

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

ggplot(data=diamonds, aes(carat, cut)) + geom_boxploth()

Dibuat pada 2020-03-11 oleh paket reprex (v0.3.0)

Tjebo
sumber