hjust และ vjust ทำอะไรเมื่อสร้างจุดโดยใช้ ggplot


159

ทุกครั้งที่ฉันทำพล็อตโดยใช้ ggplot ฉันใช้เวลาเล็กน้อยในขณะที่พยายามค่าที่แตกต่างสำหรับ hjust และ vjust ในบรรทัดเช่น

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

เพื่อให้ป้ายกำกับแกนเรียงกันตรงที่ที่ป้ายกำกับแกนเกือบแตะแกนนั้นและทำการลบออก (ให้ชิดกับแกนดังนั้นเพื่อพูด) อย่างไรก็ตามฉันไม่เข้าใจจริงๆว่าเกิดอะไรขึ้น บ่อยครั้งที่hjust = 0.5ให้ผลลัพธ์ที่แตกต่างอย่างมากจากhjust = 0.6ที่ฉันไม่สามารถเข้าใจได้โดยการเล่นกับค่าที่ต่างกัน

ทุกคนสามารถชี้ให้ฉันเห็นคำอธิบายที่ครอบคลุมว่าตัวเลือก hjust and vjust ทำงานอย่างไร


1
ฉันได้ยกตัวอย่างเฉพาะในความคิดเห็นต่อคำตอบแรก เห็นได้ชัดว่าการใช้ตัวเลขนอก 0-1 นั้นไม่ได้ถูกกำหนดซึ่งหากไม่อธิบายว่าทำไม hjust = -1 มีพฤติกรรมที่แปลกประหลาดอย่างน้อยก็อธิบายว่าต้องมีการคาดเดาที่แปลกประหลาด
วิลเลียมกันน์

คำตอบ:


277

ค่าของhjustและvjustถูกกำหนดระหว่าง 0 ถึง 1 เท่านั้น:

  • 0 หมายถึงชิดซ้าย
  • 1 หมายถึงความชอบธรรม

ที่มา: ggplot2, Hadley Wickham, หน้า 196

(ใช่ฉันรู้ว่าในกรณีส่วนใหญ่คุณสามารถใช้งานได้นอกเหนือจากช่วงนี้ แต่อย่าคาดหวังว่ามันจะทำงานในลักษณะเฉพาะใด ๆ นี่เป็นข้อมูลจำเพาะภายนอก)

hjustควบคุมการจัดแนวแนวนอนและvjustการควบคุมแนวตั้ง

ตัวอย่างควรทำให้ชัดเจน:

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

ป้อนคำอธิบายรูปภาพที่นี่


เพื่อให้เข้าใจสิ่งที่เกิดขึ้นเมื่อคุณเปลี่ยนhjustข้อความในแกนคุณต้องเข้าใจว่าการจัดตำแหน่งแนวนอนสำหรับข้อความแกนถูกกำหนดโดยไม่เกี่ยวข้องกับแกน x แต่เป็นพล็อตทั้งหมด (ซึ่งรวมถึงข้อความแกน y) (นี่คือในมุมมองของฉันโชคไม่ดีมันจะมีประโยชน์มากขึ้นที่จะมีการจัดตำแหน่งสัมพันธ์กับแกน)

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)

ป้อนคำอธิบายรูปภาพที่นี่


ในการสำรวจว่าเกิดอะไรขึ้นกับการvjustกำหนดป้ายชื่อแกน:

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)

ป้อนคำอธิบายรูปภาพที่นี่


1
ดังนั้นสำหรับกรณีของ angle = 45 เมื่อฉันมีเลเบลแกนที่มีความยาวต่างกันสมมุติว่าจาก 25 ถึง 5 ตัวอักษรพวกมันไม่ได้จัดชิดขอบชิดด้านขวาหรือด้านซ้ายของขอบเขตคำ ดูแกนที่นี่ถ้าฉันใช้มุม = 45 ฉันจะทำให้มันถูกต้องและชิดกับแกนได้อย่างไร
วิลเลียมกันน์

ฉันได้พยายามที่และฉันได้รับError in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)สำหรับการvjust = .72ขึ้นและสูงขึ้น
วิลเลียมกันน์

1
@ WilliamGunn ฉันขอแนะนำให้คุณโพสต์คำถามใหม่ด้วยรหัสของคุณ
Andrie

1
เนื่องจาก opt ถูกคัดค้านเราจะปรับตำแหน่งของชื่อแกนได้อย่างไร
Cyrus Mohammadian

1
@CyrusMohammadian ฉันได้แก้ไขคำตอบนี้เพื่อทำงานกับไวยากรณ์ ggplot2 ปัจจุบัน
หยด

16

น่าจะเป็นที่ชัดเจนที่สุดคือรูป B.1 (ง)ของหนังสือเล่ม ggplot2 ที่ภาคผนวกของที่มีอยู่ที่http://ggplot2.org/book/appendices.pdf

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามมันไม่ง่ายอย่างนั้น hjustและvjustตามที่อธิบายไว้มีวิธีการทำงานในgeom_textและtheme_text(บางครั้ง) วิธีคิดอย่างหนึ่งคือคิดกล่องรอบข้อความและจุดอ้างอิงเกี่ยวข้องกับกล่องนั้นในหน่วยที่สัมพันธ์กับขนาดของกล่อง (และแตกต่างกันสำหรับข้อความที่มีขนาดต่างกัน) hjust0.5 และvjust0.5 ศูนย์กล่องในจุดอ้างอิง ลดการเคลื่อนย้ายกล่องที่เหมาะสมตามจำนวนเงินของกล่องความกว้างเท่าhjust0.5-hjustดังนั้นเมื่อhjust=0ขอบด้านซ้ายของกล่องอยู่ที่จุดอ้างอิง การเพิ่มขึ้นของการเคลื่อนย้ายกล่องที่เหลือจากปริมาณของกล่องความกว้างเท่าhjusthjust-0.5เมื่อไหร่hjust=1กล่องถูกย้ายไปครึ่งความกว้างของกล่องที่เหลือจากกึ่งกลางซึ่งวางขอบด้านขวาบนจุดอ้างอิง ถ้าhjust=2ขอบด้านขวาของกล่องเป็นความกว้างของกล่องด้านซ้ายของจุดอ้างอิง (กึ่งกลางคือ2-0.5=1.5ความกว้างของกล่องด้านซ้ายของจุดอ้างอิงสำหรับแนวตั้งจะน้อยกว่าและมากขึ้นลงนี่คือสิ่งที่รูป B.1 (d) ) พูดว่า แต่มันคาดการณ์เกินกว่า [0,1]

แต่บางครั้งมันก็ใช้ไม่ได้ ตัวอย่างเช่น

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

สามแปลงหลังเหมือนกัน ฉันไม่รู้ว่าทำไม นอกจากนี้หากข้อความถูกหมุนแสดงว่ามันซับซ้อนกว่า พิจารณา

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

ครั้งแรกที่มีฉลากซ้ายชิดขอบ (ด้านล่าง) ที่สองมีพวกเขาอยู่ตรงกลางในกล่องบางเพื่อให้ศูนย์ของพวกเขาแถวและที่สามมีพวกเขาถูกต้องชอบธรรม (ดังนั้นด้านขวาของพวกเขาเข้าแถวถัดจากแกน) อันสุดท้ายฉันก็ไม่สามารถอธิบายได้อย่างสอดคล้องกัน มันมีบางอย่างเกี่ยวกับขนาดของข้อความขนาดของข้อความที่กว้างที่สุดและฉันก็ไม่แน่ใจ


ขอบคุณมากสำหรับสิ่งนี้สิ่งนี้ช่วยในกรณีที่ angle = 90 แต่สิ่งที่ฉันไม่ได้รับคือเหตุผลที่การจัดชิดขอบที่เหมาะสมของฉลากไม่ทำงานอีกต่อไปเมื่อแทนที่จะใช้ angle = 90 ฉันใช้ angle = 45 ฉันเข้าใจพฤติกรรมของมุม = 45, hjust = 0 แต่มุม = 45, hjust = -1 เป็นเพียงที่แปลกประหลาด
วิลเลียมกันน์

ตัวอย่างแรกของคุณทำงานได้จริง เหตุผลที่คุณคิดว่ามันใช้งานไม่ได้เป็นเพราะฉลากทั้งหมดของคุณมีความสูงเท่ากัน ลองอีกครั้งด้วยDF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)- เช่นมีการแบ่ง\nบรรทัดในหนึ่งในชื่อเรื่อง
Andrie

@ วิลเลียมฉันคิดว่า @Andrie มันถูกต้อง; hjustและvjustถูกกำหนดระหว่าง 0 ถึง 1 เท่านั้น พฤติกรรมนอกช่วงนั้นไม่จำเป็นต้องสมเหตุสมผล
Brian Diggs

@Andrie คุณพูดถูก แต่ฉันยังมีเวลาลำบากในการสร้างแบบจำลองทางจิตที่เชื่อมโยงกันในชื่อเรื่องแกน / กรณีข้อความ สำหรับข้อความในแนวแกนให้hjust=0จัดชิดขอบซ้ายกับ tic hjust=0.5ศูนย์ในการกระตุก; hjust=1จัดตำแหน่งขอบด้านขวาด้วย tic (กล่องเคลื่อนไหวที่สัมพันธ์กับจุดอ้างอิง) แต่vjustจัดเรียงภายในขนาดกล่องของฉลากที่สูงที่สุด
Brian Diggs

@BrianDiggs ในกรณีของvjustป้ายชื่อแกนป้ายทั้งหมดจะถูกจัดตำแหน่งพร้อมกัน ดังนั้นทั้งหมดของด้านบนขอบชิดเมื่อและเช่นเดียวกันทุกขอบด้านล่างเมื่อvjust=1 vjust=0นี่ทำให้ฉันรู้สึกสมบูรณ์แบบ
Andrie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.