Làm cách nào để sửa tỷ lệ khung hình trong ggplot?


88

Tôi đang cố gắng thay đổi kích thước của một âm mưu để phù hợp với tài liệu của mình, nhưng tôi gặp khó khăn khi làm cho sơ đồ được vẽ là một hình vuông.

Thí dụ:

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

Mặc dù các giới hạn cho x và y là như nhau, nhưng biểu đồ trong kết quả không phải là hình vuông. Tôi đoán rằng R làm cho bảng bao quanh 5x5 "nhưng không quan tâm đến kích thước sơ đồ thực tế.

Làm cách nào để gỡ bỏ sơ đồ của tôi?

Câu trả lời:


113

Trong ggplotcơ chế bảo toàn tỷ lệ khung hình của cốt truyện của bạn là thêm một coord_fixed()lớp vào cốt truyện. Điều này sẽ bảo toàn tỷ lệ co của chính âm mưu, bất kể hình dạng của hộp giới hạn thực tế.

(Tôi cũng khuyên bạn nên sử dụng ggsaveđể lưu âm mưu kết quả của mình thành pdf / png / etc, thay vì pdf(); print(p); dev.off()chuỗi.)

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

nhập mô tả hình ảnh ở đây


3
Bạn có biết tại sao ggplot nhất quyết đặt nhãn trục y ra bên trái không? Tôi muốn biết làm thế nào để ngăn chặn điều đó ...
Đuổi theo

@chase Một giải pháp kludgy là sửa đổi hjustvị trí của tiêu đề - hãy thử opts(axis.title.y=theme_text(hjust=10)). Nhưng, đáng buồn thay, có vẻ như không. Xem groups.google.com/group/ggplot2/browse_thread/thread/… để biết thảo luận về danh sách gửi thư ggplot và câu trả lời của @ Baptiste.
Andrie

3
Hành vi đó được sửa trong phiên bản phát triển.
hadley

5
Với tiêu đề tổng quát hơn của câu hỏi, bạn cũng có thể thêm thông tin về cách tính tỷ lệ (đối số cho coord_fixed) được đưa ra không sử dụng các giới hạn giống nhau trên cả hai trục?
htorque

1
Thêm vào bình luận của @ htorque; nếu y được định nghĩa thay thế y=runif(100, 0, 50)thì khía cạnh của ô không còn là hình vuông nữa. coord_fixed()Làm cho tỷ lệ của mỗi trục là bằng nhau chỉ có vẻ như?
một ben khác

79

Để đảm bảo một tỷ lệ khung hình cụ thể, ví dụ như hình vuông, hãy sử dụng theme(aspect.ratio=1).

Câu trả lời của Andrie không cung cấp bức tranh đầy đủ, vì ví dụ cung cấp dữ liệu có lẽ không tự nhiên trong đó phạm vi của x bằng phạm vi của y. Tuy nhiên, nếu dữ liệu là:

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

thì cốt truyện sẽ như thế này:

nhập mô tả hình ảnh ở đây

Hàm coord_fixed () cũng có một đối số để điều chỉnh tỷ lệ của các trục:

ratio tỷ lệ co, được biểu thị bằng y / x

Vì vậy, âm mưu có thể được tạo thành hình vuông với:

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

nhập mô tả hình ảnh ở đây

Nhưng bạn cần phải điều chỉnh điều này với giới hạn của các biến hoặc diện tích ô (không phải tất cả các giới hạn đều chia hết cho các số nguyên như các ví dụ này).


11

Vì lợi ích hoàn chỉnh: Nếu bạn muốn tính đến các giới hạn trục rất khác:

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)

Dẫn đến:


14
làm thế nào là tốt hơn plot + theme(aspect.ratio=4/3)? Ggplot có thể có nhiều lớp, với nhiều tập dữ liệu và các trục có thể có hệ số mở rộng tùy ý, do đó, việc tính toán tỷ lệ y / x từ một nguồn dữ liệu có vẻ khá mong manh.
baptiste vào

2
Bởi vì điều này dường như không dễ dàng phát hiện ra. Điều này được chứng minh bằng thực tế rằng có ba câu trả lời ở đây, nhưng không có câu trả lời nào đề cập đến nó. Bạn nên đặt nó trong một câu trả lời, nó chắc chắn là giải pháp tốt hơn.
Graipher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.