วิธีแก้ไขอัตราส่วนภาพใน ggplot


89

ฉันกำลังพยายามปรับขนาดพล็อตเพื่อให้พอดีกับเอกสารของฉัน แต่ฉันมีปัญหาในการทำให้ไดอะแกรมพล็อตเป็นสี่เหลี่ยมจัตุรัส

ตัวอย่าง:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

แม้ว่าขีด จำกัด สำหรับ x และ y จะเหมือนกัน แต่พล็อตในผลลัพธ์จะไม่เป็นกำลังสอง ฉันเดาว่า R สร้างแผงปิด 5x5 "แต่ไม่สนใจขนาดไดอะแกรมจริง

ฉันจะยกเลิกการเรียงลำดับไดอะแกรมของฉันได้อย่างไร

คำตอบ:


115

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

(ฉันขอแนะนำให้คุณใช้ggsaveเพื่อบันทึกพล็อตผลลัพธ์ของคุณเป็น pdf / png / etc แทนที่จะเป็นpdf(); print(p); dev.off()ลำดับ)

library(ggplot2)
df <- data.frame(
    x = runif(100, 0, 5),
    y = runif(100, 0, 5))

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

ใส่คำอธิบายภาพที่นี่


3
คุณรู้หรือไม่ว่าทำไม ggplot ยืนยันที่จะวางป้ายแกน y ออกไปทางซ้าย? อยากรู้วิธีป้องกัน ...
Chase

@chase kludgy แก้ปัญหาคือการปรับเปลี่ยนhjustตำแหน่งของชื่อ - opts(axis.title.y=theme_text(hjust=10))ลอง แต่น่าเศร้าที่ดูเหมือนจะไม่ใช่ ดูgroups.google.com/group/ggplot2/browse_thread/thread/…สำหรับการสนทนาในรายชื่ออีเมลของ ggplot และคำตอบของ @ Baptiste
Andrie

3
ลักษณะการทำงานนั้นได้รับการแก้ไขในเวอร์ชันการพัฒนา
hadley

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

1
เพิ่มเติมจากความคิดเห็นของ @ htorque; ถ้า y ถูกกำหนดแทนy=runif(100, 0, 50)แล้วลักษณะของพล็อตจะไม่เป็นสี่เหลี่ยมจัตุรัสอีกต่อไป coord_fixed()ทำให้สเกลของแต่ละแกนเท่ากันดูเหมือน?
เบ็นที่แตกต่างกัน

81

theme(aspect.ratio=1)เพื่อให้แน่ใจว่าอัตราส่วนโดยเฉพาะอย่างยิ่งเช่นสำหรับตารางการใช้

คำตอบของ Andrie ไม่ได้ให้ภาพทั้งหมดเนื่องจากตัวอย่างอาจให้ข้อมูลที่ไม่เป็นธรรมชาติโดยที่ช่วงของ x เท่ากับช่วงของ y อย่างไรก็ตามหากข้อมูลเป็น:

df <- data.frame(
  x = runif(100, 0, 50),
  y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

จากนั้นพล็อตจะมีลักษณะดังนี้:

ใส่คำอธิบายภาพที่นี่

ฟังก์ชัน Coord_fixed () ยังมีอาร์กิวเมนต์เพื่อปรับอัตราส่วนของแกน:

ratio อัตราส่วนแสดงเป็น y / x

เพื่อให้พล็อตสามารถสร้างเป็นสี่เหลี่ยมจัตุรัสด้วย:

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)

ใส่คำอธิบายภาพที่นี่

แต่คุณต้องปรับค่านี้ด้วยขีด จำกัด ของตัวแปรหรือพื้นที่พล็อต (ไม่ใช่ข้อ จำกัด ทั้งหมดที่หารด้วยจำนวนเต็มอย่างตัวอย่างเหล่านี้ไม่ได้)


13

เพื่อความสมบูรณ์: หากคุณต้องการคำนึงถึงขีด จำกัด แกนที่แตกต่างกันมาก:

df <- data.frame(
  x = runif(100, 0, 5000),
  y = runif(100, 0, 5))
ratio.display <- 4/3
ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
plot + coord_fixed(ratio.values / ratio.display)

ที่เกิดขึ้นใน:


14
มันดีกว่ายังplot + theme(aspect.ratio=4/3)ไง? ggplot อาจมีหลายเลเยอร์โดยมีชุดข้อมูลหลายชุดและแกนอาจมีปัจจัยการขยายตามอำเภอใจดังนั้นการคำนวณอัตราส่วนของ y / x จากแหล่งข้อมูลเดียวจึงค่อนข้างเปราะบาง
baptiste

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