Ggplot2'de eksen etiketlerini döndürme ve aralıklama


669

X ekseni etiketleri uzun olan bir faktör olduğu bir arsa var. Muhtemelen ideal bir görselleştirme olmasa da, şimdilik bu etiketleri dikey olarak döndürmek istiyorum. Bu bölümü aşağıdaki kodla çözdüm, ancak gördüğünüz gibi etiketler tamamen görünmüyor.

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

resim açıklamasını buraya girin

Yanıtlar:


1112

Son satırı olarak değiştir

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

Varsayılan olarak, eksenler döndürüldüğünde bile metnin ortasında hizalanır. +/- 90 derece döndürdüğünüzde, bunun genellikle kenarda hizalanmasını istersiniz:

alternatif metin

Yukarıdaki resim bu blog yazısından .


95
Ggplot2'nin en yeni sürümünde komut şöyle olacaktır: q + theme(axis.text.x=element_text(angle = -90, hjust = 0))
rnorberg

55
Burada açıklandığı gibi davranmayanlara deneyin theme(axis.text.x=element_text(angle = 90, vjust = 0.5)). Ggplot2 0.9.3.1 itibariyle bu çözüm gibi görünüyor.
lilster

42
Aslında, doğru hizalanmış etiketler elde etmek için yukarıdaki iki çözümü birleştirmek zorunda kaldım:q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
jupp0r

32
@ jupp0r doğru. theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))GÜNCEL OLARAK ÇALIŞAN TEK.

51
45 ° döndürülmüş etiketler (okunması daha kolay) istiyorsanız theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))iyi sonuçlar verir
jan-glx

89

Onay etiketlerindeki metni tamamen görünür hale getirmek ve y ekseni etiketiyle aynı yönde okumak için son satırı şu şekilde değiştirin:

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

81

kullanım coord_flip()

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

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

resim açıklamasını buraya girin


Veri Bilimi için R'nin 3.9 numaralı bölümünde , Wickham ve Grolemund tam olarak şu soruyu konuşuyor:

coord_flip()x ve y eksenlerini değiştirir. Yatay kutu grafikleri istiyorsanız, bu yararlıdır (örneğin). Uzun etiketler için de kullanışlıdır: x ekseninde üst üste binmeden bunları sığdırmak zordur.


26

Alternatif bir çözüm sunmak istiyorum , tuval döndürme özelliğini tanıdığından , ggtern'in en son sürümünde önermek istediğim gibi güçlü bir çözüm gerekiyordu .

Temel olarak, bir element_textnesneyi döndüren bir fonksiyon , verilen açı (derece) ve konumlandırma (yani x, y, üst veya sağ) bilgisini veren trigonometri kullanarak bağıl pozisyonları belirlemeniz gerekir .

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

Açıkçası, bence, 'otomatik' bir seçeneğin ggplot2 için hjustve vjustaçısını belirtirken argümanlar, neyse, nasıl yukarıdaki eserlerini göstermek sağlar.

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

Hangi aşağıdakileri üretir:

Misal


1
Aynı sonuçları elde edemiyorum, benim için eksen metni asla otomatik yönteminizle iyi ayarlanmamış. Ancak, kullanmak rads = (-angle - positions[[ position ]])*pi/180daha iyi yerleşimler üretti. Açıdan önceki eksi işaretine dikkat edin. Yine de kod için teşekkürler :)
asac

7

Ggpubr paket teklifler varsayılan (sağa yaslamak metin, kene orta hizalama metin kutusu) doğru olanı yapan bir kısayol:

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

Reprex paketi tarafından 2018-11-06 tarihinde oluşturuldu (v0.2.1)

İlgili bağımsız değişken adları için GitHub aramasıyla bulundu: https://github.com/search?l=R&q=element_text+angle+90+vjust+org%3Acran&type=Code


5

Alternatif olarak, ggplot 3.3.0içerir guide_axis(n.dodge = 2)(aynı guideargüman scale_..veya xdeğişken için guidesdikey olarak etiket kaçmak aşırı çizim sorunun üstesinden gelmek için). Bu durumda oldukça iyi çalışır:

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


1

Ek bağımlılıklar olmadan okunabilir x tick etiketleri almak için aşağıdakileri kullanmak istersiniz:

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

Bu, kene etiketlerini saat yönünün tersine 90 ° döndürür ve uçlarında ( hjust = 1) ve merkezlerinde yatay olarak karşılık gelen tik işareti ile (vjust = 0.5 ) .

Tam örnek:

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


Not dikey / yatay hizalama parametreleri o vjust/ hjustbir element_textmetne göredir. Bu nedenle, vjustsorumlu yatay hizalamadan .

Bu olmadan vjust = 0.5şöyle görünecektir:

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

Bu olmadan hjust = 1şöyle görünecektir:

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

Bazı (kablolu) nedenlerden dolayı, kene etiketlerini saat yönünde 90 ° döndürmek isterseniz (soldan okunabilecek şekilde) kullanmanız gerekir: q + theme(axis.text.x = element_text(angle = -90, vjust = 0.5, hjust = -1)) .

Bütün bunlar zaten bu cevabın yorumlarında tartışıldı, ancak bu soruya o kadar sık ​​dönüyorum ki, yorumları okumadan kopyalayabileceğim bir cevap istiyorum.


0

Alternatif olarak paketi coord_flip()kullanmaktır ggstance. Avantajı, grafikleri diğer grafik türleriyle birleştirmeyi kolaylaştırır ve belki daha da önemlisi, koordinat sisteminiz için sabit ölçek oranlarını ayarlayabilirsiniz .

library(ggplot2)
library(ggstance)

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

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

2020-03-11 tarihinde reprex paketi tarafından oluşturuldu (v0.3.0)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.