Ggplot kullanarak bir arsa yaparken hjust ve vjust ne yapar?


159

Ggplot kullanarak bir komplo oluşturduğumda, bir satırda hjust ve vjust için farklı değerler denerken biraz harcıyorum

+ opts(axis.text.x = theme_text(hjust = 0.5))

eksen etiketlerinin, eksen etiketlerinin neredeyse eksene temas ettiği yerde hizalanmasını sağlamak ve buna göre aynı hizada olmak (tabiri caizse eksene göre doğrulanmış). Ancak, neler olduğunu gerçekten anlamıyorum. Çoğu zaman, hjust = 0.5bu tür dramatik farklı sonuçlar verir hjust = 0.6, örneğin, onu anlamaya edemedik sadece farklı değerlerle etrafında oynayarak,.

Herkes beni hjust ve vjust seçeneklerinin nasıl çalıştığına dair kapsamlı bir açıklamaya yönlendirebilir mi?


1
İlk cevaba yapılan yorumlarda özel bir örnek verdim. Görünüşe göre 0-1 dışında sayılar kullanmak tanımsızdır, bu da hjust = -1'in neden tuhaf davranışa sahip olduğunu açıklamıyorsa, en azından tuhafın bekleneceğini açıklar.
William Gunn

Yanıtlar:


277

Değeri hjustve vjustsadece 0 ve 1 arasında tanımlanmıştır:

  • 0 sola dayalı
  • 1 doğru haklı demektir

Kaynak: ggplot2, Hadley Wickham, sayfa 196

(Evet, çoğu durumda bu aralığın ötesinde kullanabileceğinizi biliyorum, ancak herhangi bir şekilde davranmasını beklemeyin. Bu özelliklerin dışındadır.)

hjustyatay yaslamayı vjustkontrol eder ve dikey yaslamayı kontrol eder.

Bir örnek bunu açıklığa kavuşturmalıdır:

td <- expand.grid(
    hjust=c(0, 0.5, 1),
    vjust=c(0, 0.5, 1),
    angle=c(0, 45, 90),
    text="text"
)

ggplot(td, aes(x=hjust, y=vjust)) + 
    geom_point() +
    geom_text(aes(label=text, angle=angle, hjust=hjust, vjust=vjust)) + 
    facet_grid(~angle) +
    scale_x_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2)) +
    scale_y_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2))

resim açıklamasını buraya girin


hjustEksen metnini değiştirdiğinizde ne olacağını anlamak için , eksen metninin yatay hizalamasının x eksenine değil, tüm grafiğe göre tanımlandığını anlamanız gerekir (bunun y ekseni metnini içerir). (Bu benim görüşüme göre talihsiz. Eksene göre hizalamaya sahip olmak çok daha yararlı olacaktır.)

DF <- data.frame(x=LETTERS[1:3],y=1:3)
p <- ggplot(DF, aes(x,y)) + geom_point() + 
    ylab("Very long label for y") +
    theme(axis.title.y=element_text(angle=0))


p1 <- p + theme(axis.title.x=element_text(hjust=0)) + xlab("X-axis at hjust=0")
p2 <- p + theme(axis.title.x=element_text(hjust=0.5)) + xlab("X-axis at hjust=0.5")
p3 <- p + theme(axis.title.x=element_text(hjust=1)) + xlab("X-axis at hjust=1")

library(ggExtra)
align.plots(p1, p2, p3)

resim açıklamasını buraya girin


vjustEksen etiketlerinin hizalanmasıyla neler olduğunu keşfetmek için :

DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p1 <- p + theme(axis.text.x=element_text(vjust=0, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0")
p2 <- p + theme(axis.text.x=element_text(vjust=0.5, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0.5")
p3 <- p + theme(axis.text.x=element_text(vjust=1, colour="red")) + 
        xlab("X-axis labels aligned with vjust=1")


library(ggExtra)
align.plots(p1, p2, p3)

resim açıklamasını buraya girin


1
Yani açı = 45 için, değişen uzunluktaki eksen etiketlerine sahip olduğumda, diyelim ki 25 ila 5 karakter arasında, ikisi de kelime sınırlarının sağına veya soluna yaslanmış olarak hizalanmamıştır. Buradaki eksenlere bir göz atın = 45 açısını kullanacak olsaydım, bunları nasıl doğru bir şekilde gerekçelendirebilir ve eksene göre hizalayabilirim?
William Gunn

Bunu denedim, ve ben almak Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)için vjust = .72ve daha yüksek.
William Gunn

1
@WilliamGunn Kodunuzla yeni bir soru göndermenizi öneririm.
Andrie

1
opt, kullanımdan kaldırıldığından, eksen başlığının konumunu nasıl ayarlayabiliriz?
Cyrus Mohammadian

1
@CyrusMohammadian, şu anki ggplot2 sözdizimi ile çalışmak için bu cevabı düzenledim.
Damlacık

16

Muhtemelen en kesin olanı , ekleri http://ggplot2.org/book/appendices.pdf adresinde bulunan ggplot2 kitabının Şekil B.1 (d) ' dir .

resim açıklamasını buraya girin

Ancak, o kadar da basit değil. hjustve vjusttarif edildiği gibi nasıl geom_textve theme_textbazen de çalışır . Bunu düşünmenin bir yolu, metnin etrafındaki bir kutuyu ve referans noktasının o kutu ile ilişkili olduğu yerde, kutunun boyutuna göre birimler halinde (ve dolayısıyla farklı boyuttaki metinler için farklı) düşünmektir. Bir hjust0.5 ve vjust0.5 merkezi bir referans noktasında kutu. Küçültme hjust, kutuyu, kutu genişliği sürelerinin bir miktarına doğru hareket ettirir 0.5-hjust. Böylece hjust=0kutunun sol kenarı referans noktasında olduğunda. Artan hjustkutuyu, kutu genişliği sürelerinin bir miktar sola taşır hjust-0.5. Ne zamanhjust=1, kutunun ortaından sola doğru yarım kutu genişliği taşınır, bu da sağ kenarı referans noktasına getirir. Eğer hjust=2, kutunun sağ kenarı (merkez referans noktasının sol genişliği bir kutu 2-0.5=1.5kutu genişlikleri dikey için. Referans noktası sol, daha fazla ve daha çok aşağıda. Bu etkin ne olduğu Şekil B.1 (d ) diyor, ancak [0,1] öteye geçiyor.

Ancak, bazen bu işe yaramaz. Örneğin

DF <- data.frame(x=c("a","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p + opts(axis.text.x=theme_text(vjust=0))
p + opts(axis.text.x=theme_text(vjust=1))
p + opts(axis.text.x=theme_text(vjust=2))

Son üç grafik aynıdır. Bunun neden olduğunu bilmiyorum. Ayrıca, metin döndürülürse, daha karmaşıktır. Düşünmek

p + opts(axis.text.x=theme_text(hjust=0, angle=90))
p + opts(axis.text.x=theme_text(hjust=0.5 angle=90))
p + opts(axis.text.x=theme_text(hjust=1, angle=90))
p + opts(axis.text.x=theme_text(hjust=2, angle=90))

Birincisi etiketleri sola yaslanmış (altına karşı), ikincisi onları bir kutuda ortalamış, böylece merkezleri sıralanmış ve üçüncüsü sağa yaslanmış (sağ tarafları eksenin yanında sıralanmıştır). Sonuncusu, tutarlı bir şekilde açıklayamam. Metnin boyutu, en geniş metnin boyutu ile ilgili bir şey var ve başka ne olduğundan emin değilim.


Bunun için çok teşekkürler, bu açı = 90 olduğu durumda yardımcı olur, ancak elde edemediğim, açı = 90 yerine etiketlerin doğru gerekçesinin neden işe yaramadığıdır. Açı = 45, hjust = 0 davranışını anlıyorum, ancak açı = 45, hjust = -1 sadece tuhaf.
William Gunn

İlk örneğiniz aslında işe yarıyor. Bunun işe yaramadığını düşünmenizin nedeni, tüm etiketlerinizin aynı yüksekliğe sahip olmasıdır. Tekrar deneyin DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)- yani \nbaşlıklardan birinde bir satır sonu ile .
Andrie

@William, bence @Andrie doğru; hjustve vjustsadece 0 ile 1 arasında tanımlanır; bu aralığın dışındaki davranışların mantıklı olması gerekmez.
Brian Diggs

@Andrie, haklısın. Ama hala eksen başlığı / metin durumunda tutarlı bir zihinsel model yapmakta zorlanıyorum. Eksen metni hjust=0için sol kenarı tik ile hizalar; hjust=0.5tic üzerinde merkezler; hjust=1sağ kenarı tik ile hizalar (referans noktasına göre hareketli kutu). Ama vjusthizalar içinde bir uzun etiketin boyutunu kutu.
Brian Diggs

@BrianDiggs vjustEksen etiketleri söz konusu olduğunda , tüm etiketler aynı anda birbiriyle hizalanır. Böylece tüm üst kenarlar ne zaman hizalanır vjust=1ve aynı şekilde tüm alt kenarlar ne zaman hizalanır vjust=0. Bu benim için çok mantıklı.
Andrie
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.