Làm cách nào để xếp theo chiều dọc hai biểu đồ có cùng tỷ lệ x, nhưng tỷ lệ y khác nhau trong R?


9

Lời chào hỏi,

Hiện tại tôi đang làm như sau trong R:

require(zoo)
data <- read.csv(file="summary.csv",sep=",",head=TRUE)
cum  = zoo(data$dcomp, as.Date(data$date))
data = zoo(data$compressed, as.Date(data$date))
data <- aggregate(data, identity, tail, 1)
cum  <- aggregate(cum, identity, sum, 1)
days = seq(start(data), end(data), "day")
data2 = na.locf(merge(data, zoo(,days)))

plot(data2,xlab='',ylab='compressed bytes',col=rgb(0.18,0.34,0.55))
lines(cum,type="h",col=rgb(0,0.5,0))

Đoạn trích tóm tắt.csv:

date,revision,file,lines,nclass,nattr,nrel,bytes,compressed,diff,dcomp
2007-07-25,16,model.xml,96,11,22,5,4035,991,0,0
2007-07-27,17,model.xml,115,16,26,6,4740,1056,53,777
2007-08-09,18,model.xml,106,16,26,7,4966,1136,47,761
2007-08-10,19,model.xml,106,16,26,7,4968,1150,4,202
2007-09-06,81,model.xml,111,16,26,7,5110,1167,13,258
...

Hai dòng cuối cùng biểu thị thông tin tôi cần và kết quả tương tự như sau: văn bản thay thế Dòng màu xanh là entropy tính theo byte của tạo phẩm mà tôi quan tâm. Đường màu xanh lá cây đại diện cho entropy của những thay đổi.

Bây giờ, trong biểu đồ này, nó hoạt động tốt vì không có sự khác biệt lớn về tỷ lệ. Nhưng tôi có các biểu đồ khác trong đó các đường màu xanh lá cây trở nên nhỏ đến mức không thể nhìn thấy.

Giải pháp tôi đang tìm kiếm, liên quan đến hai điều:

  1. Để di chuyển các đường thẳng đứng màu xanh lá cây sang biểu đồ thứ hai, ngay bên dưới đường đầu tiên, với trục y của chính nó, nhưng trục x được chia sẻ.
  2. Để cung cấp cho nó thang đo logarit, vì tôi quan tâm đến "độ lớn" hơn là các giá trị cụ thể.

Cảm ơn trước!

PS Nếu ai đó cũng có thể cho tôi biết làm thế nào tôi có thể đặt "dấu tích nhỏ" trong thang đo x liên quan đến các tháng, tôi đánh giá cao :-) Nếu đây là quá nhiều câu hỏi cho một bài đăng, tôi có thể chia chúng thêm.

Câu trả lời:


15

Bạn có thể sử dụng par(new=TRUE)để vẽ đồ thị vào cùng một biểu đồ bằng hai trục y khác nhau! Điều này cũng sẽ giải quyết vấn đề của bạn.

Tiếp theo, bạn sẽ tìm thấy một ví dụ đơn giản là vẽ hai biến bình thường ngẫu nhiên, một biến có nghĩa là 0 biến còn lại trên trung bình 100 (cả hai sd s = 1) trong cùng một âm mưu. Cái đầu tiên màu đỏ trên trục y bên trái, cái thứ hai màu xanh lam trên trục y bên phải. Sau đó, nhãn trục được thêm vào.

Ở đây bạn đi:

x <- 1:10
y1 <- rnorm(10)
y2 <- rnorm(10)+100

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2))
par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,105))

axis(side=2)
axis(side=4)

sau đó trông như thế này (nhớ màu đỏ ở trục trái, màu xanh ở trục phải): văn bản thay thế

CẬP NHẬT:
Dựa trên ý kiến ​​tôi đã tạo ra một phiên bản cập nhật của biểu đồ của tôi. Bây giờ tôi đào sâu hơn một chút vào chức năng biểu đồ cơ sở bằng cách sử dụng par(mar=c(a,b,c,d))để tạo ra một lề lớn hơn xung quanh biểu đồ (cần thiết cho nhãn trục phải), mtextđể hiển thị nhãn trục và sử dụng axischức năng nâng cao :

x <- 1:100
y1 <- rnorm(100)
y2 <- rnorm(100)+100

par(mar=c(5,5,5,5))

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2),ylab="")
axis(side=2, at=c(-2,0,2))
mtext("red line", side = 2, line=2.5, at=0)

par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,108), ylab="")
axis(side=4, at=c(98,100,102), labels=c("98%","100%","102%"))
mtext("blue line", side=4, line=2.5, at=100)

văn bản thay thế

Như bạn thấy nó là khá thẳng về phía trước. Bạn có thể xác định vị trí của dữ liệu của mình ylimtrong plothàm, sau đó sử dụng attrong axishàm để chọn trục nào bạn muốn xem. Hơn nữa, bạn thậm chí có thể cung cấp các nhãn cho các ve trục (khá hữu ích cho danh nghĩa trục x) thông qua labelstrong axischức năng (thực hiện ở đây trên trục bên phải). Để thêm nhãn trục, sử dụng mtextvới atđịnh vị dọc ( lineđối với định vị ngang).

Hãy chắc chắn để kiểm tra ?plot, ?par, ?axis, và ?mtextcho biết thêm thông tin.
Tài nguyên web tuyệt vời là: Quick-R cho đồ thị: 1 , 23 .


Điều đó thật thú vị, nhưng làm thế nào để chúng ta nói với người đọc thang đo nào tương ứng với dòng nào?
Hugo Sereno Ferreira

Hãy xem biểu đồ này: imgur.com/K8BCr.png Ở đó, chúng tôi chỉ trình bày các nhãn trục Y và đánh dấu vào nơi chúng áp dụng cho dữ liệu (nghĩa là đối với trục trái trên đỉnh của biểu đồ, như dữ liệu tương ứng, và cho trục bên phải ở dưới cùng của biểu đồ, dưới dạng dữ liệu sửa lỗi). Ngoài ra, chúng tôi đã sử dụng các màu khác nhau (như trong ví dụ ở trên) và các loại đường và giải thích nó trong chú thích. Bạn cũng có thể sử dụng biểu đồ đường bên trái và biểu đồ thanh ở trục phải để làm cho sự khác biệt rõ ràng hơn.
Henrik

Ví dụ bạn đã đưa ra là rất tốt ... Làm thế nào bạn quản lý để bù dọc cho mỗi trục?
Hugo Sereno Ferreira

2
Ví dụ thực sự tốt. Vấn đề duy nhất với biểu đồ của bạn là cả hai tên biến Y đều trùng nhau. Trong trường hợp này, bạn sẽ muốn một cái ở bên trái và cái kia ở bên phải (thậm chí có thể ở vị trí thẳng đứng). Để nâng cấp ví dụ của bạn từ "thực sự tốt" lên "hoàn hảo", bạn có thể muốn sử dụng hàm mtext từ R để thực hiện các tên biến
Dave Kellen

@Hugo @Dave: Xem bản cập nhật của tôi để kết hợp cả hai ý kiến.
Henrik

12

Tôi nghĩ bạn có thể có được những gì bạn muốn sử dụng ggplot2. Sử dụng mã dưới đây, tôi có thể sản xuất:

văn bản thay thế

Rõ ràng những thứ như màu đường có thể được thay đổi thành những gì bạn muốn. Trên trục x tôi đã chỉ định các dòng chính theo năm và dòng nhỏ theo tháng.

require(ggplot2)
t = as.Date(0:1000, origin="2008-01-01")  
y1 = rexp(1001)
y2 = cumsum(y1)
df = data.frame(t=t, values=c(y2,y1), type=rep(c("Bytes", "Changes"), each=1001))

g = ggplot(data=df, aes(x=t, y=values)) +
  geom_line() +
  facet_grid(type ~ ., scales="free") +
  scale_y_continuous(trans="log10") +
  scale_x_date(major="years", minor="months") +
  ylab("Log values")
g

Uh, tôi đã thử thiết lập df = data.frame (t = days, value = c (data2, cum), type = rep (c ("Byte", "Change"), mỗi = 1001)), nhưng nó cho Lỗi trong rbind.zoo (...): các chỉ mục trùng nhau
Hugo Sereno Ferreira

Đó là bởi vì data2 và cum là các đối tượng trong sở thú. Sử dụng as.vector (data2) để lấy các giá trị thô. Ngoài ra, tôi đã sử dụng 1001 vì tôi có 1001 quan sát. Bạn sẽ cần một cái gì đó khác biệt.
csgillespie

Người dùng Noob R tại đây: Lỗi về data.frame (t = ngày, value = c (as.vector (data2), as.vector (cum)) ,: đối số ngụ ý số lượng hàng khác nhau: 1063, 1300, 2
Hugo Sereno Ferreira

Nhập "ngày", "dữ liệu 2" và "kiêm" để xem dữ liệu của bạn. Sau đó nhìn vào "độ dài (ngày)", v.v. Bạn cần ghép các điểm thời gian với các giá trị.
csgillespie
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.