Tôi đang cố gắng tìm ra cách sử dụng grconvertX/grconvertX trong ggplot. Mục tiêu cuối cùng của tôi là thêm chú thích vào một hình ảnh ggplot2 (và có thể là mạng) với grid.text
và grid.lines
bằng cách chuyển từ tọa độ của người dùng sang tọa độ thiết bị. Tôi biết nó có thể được thực hiện với grobs nhưng tôi tự hỏi nếu có một cách dễ dàng hơn.Sử dụng grconvertX/grconvertY trong ggplot2
Đoạn mã sau cho phép tôi chuyển các giá trị từ tọa độ người dùng đến tọa độ thứ hai và sử dụng các giá trị đó để chú thích cốt truyện với grid.text
.
graphics.off() # close graphics windows
library(grid)
library(gridBase)
test= data.frame(
x = c(1,2,3),
y = c(12,10,3),
n = c(75,76,73)
)
par(mar = c(13,5,2,3))
plot(test$y ~ test$x,type="b", ann=F)
for (i in 1:nrow(test))
{
X=grconvertX(i , from="user", to="ndc")
grid.text(x=X, y =0.2, label=paste("GRID.text at\nuser.x=", i, "\n", "ndc.x=", (signif(X, 5)) ))
grid.lines(x=c(X, X), y = c(0.28, 0.33))
}
#add some code to save as PDF ...
Mã này được dựa trên các giải pháp từ một trong những bài viết trước đây của tôi: Mixing X and Y coordinate systems. Bạn có thể thấy cách x tọa độ từ cốt truyện ban đầu được chuyển thành ndc. Ưu điểm của phương pháp này là tôi có thể sử dụng thiết bị phối cho Y.
tôi cho rằng tôi có thể dễ dàng làm điều tương tự trong ggplot2 (và có thể trong lưới).
library(ggplot2)
graphics.off() # close graphics windows
qplot(x=x, y=y, data=test)+geom_line()+ opts(plot.margin = unit(c(1,3,8,1), "lines"))
for (i in 1:nrow(test))
{
X=grconvertX(i , from="user", to="ndc")
grid.text(x=X, y =0.2, label=paste("GRID.text at\nuser.x=", i, "\n", "ndc.x=", (signif(X, 5)) ))
grid.lines(x=c(X, X), y = c(0.28, 0.33))
}
#add some code to save as PDF...
Tuy nhiên, nó không hoạt động chính xác. Các tọa độ dường như hơi lệch. Các đường thẳng đứng và văn bản không tương ứng với các nhãn đánh dấu trên ô. Ai có thể cho tôi biết làm thế nào để sửa chữa nó? Cảm ơn rất nhiều trước.
Chỉ cần cập nhật, tôi đã chỉnh sửa một số định dạng trong câu hỏi của bạn để chúng phù hợp hơn với việc sử dụng đánh dấu "tiêu chuẩn" để đánh dấu mã.Ngoài ra, tốt nhất là không bao gồm các dòng xóa tất cả các đối tượng khỏi không gian làm việc của người dùng trong mã mà mọi người có khả năng nhanh chóng sao chép + dán. Để lại cho người đọc để đảm bảo rằng họ đang ở trong một phiên R sạch. – joran
Cảm ơn! Tôi nghĩ sẽ dễ dàng hơn khi làm việc trong một buổi học sạch sẽ. Tôi sẽ không thêm mã này nữa. –