Vẽ nhiều ô trên một đồ thị trong R?


13

Sử dụng mã sau đây, tôi đã cố gắng vẽ bốn ô trên biểu đồ R. Tôi không hài lòng với con số này vì có rất nhiều khoảng trống giữa các ô, do đó chiều rộng của các ô không đủ để phân tích các ô.

  1. Ai đó có thể giúp tôi tạo ra một biểu đồ đẹp có bốn ô không?

  2. Làm cách nào tôi có thể giữ nhãn trục x từ 1 đến 10 thay vì 5 nhãn mặc định?

Dữ liệu:

a1: 11.013 13.814 13.831 13.714 13.787 13.734 13.778 13.771 13.823 13.659

a2: 5.181 7.747 8.314 8.061 7.920 8.153 8.540 8.845 7.881 8.301

Tôi đã sử dụng dữ liệu a1 cho b1, c1 và d1; dữ liệu a2 cho b2, c2 và d2 chỉ ở đây.

Nhân vật:

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

Mã số:

        op=par(mfrow=c(4,1), mar=c(5.5,5.1,4.1,2.1))
        plot(a1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="A")
        lines(a2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        par(xpd=T)
        legend(1,26.5,c("X","Y"),bty="n",horiz=T,cex=1.5,col=c("red1","darkblue"),text.col=c("red1","darkblue"),pch=c(1,3),lty=c(2,3),x.intersp=0.4,adj=0.2)
        plot(b1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="B")
        lines(b2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        plot(c1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="C")
        lines(c2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        plot(d1/1000, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="D")
        lines(d2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
   > mtext("Price", side=2, at=100,line=3,cex=1.1)

1
bạn có thể vui lòng cho biết chi tiết về dữ liệu của bạn? có thể, dput (data_from_r)
suncoolsu

@suncoolsu, tôi đã cập nhật câu hỏi với một mẫu dữ liệu. Cảm ơn bạn.
samarasa

Điều gì nếu bạn có 2 màu và 4 loại đường trên cùng một trục với một huyền thoại? Tôi muốn xem mã và kết quả cho điều đó.
Paul

@ user87: Vì 4 ô là từ 4 thí nghiệm khác nhau. Do đó, tôi nghĩ rằng tốt hơn là vẽ 4 ô để phân tích kết quả từ các thí nghiệm.
samarasa

@ user87, tôi không chắc ý của bạn là gì. Có lẽ nếu bạn bắt đầu một câu hỏi mới, ai đó sẽ trả lời nó (tôi sẽ :))
Brandon Bertelsen

Câu trả lời:


16

Nếu bạn muốn gắn bó với một cái gì đó giống như phương thức bạn đang sử dụng thì bạn có thể muốn tìm hiểu lệnh layout (). Một vài thay đổi chi tiết khác và bạn có thể có được các biểu đồ gần nhau hơn. Bạn cũng có thể đặt những thứ duy nhất thay đổi giữa các biểu đồ trong một danh sách (như dữ liệu và lề) và sau đó đi qua một vòng lặp. Ngoài ra, bạn sẽ lưu ý rằng tôi đã tạo trục dưới cùng bằng lệnh trục trực tiếp () để bạn có thể kiểm soát các mục đi đâu.

layout(matrix(1:5, ncol = 1), widths = 1,
        heights = c(1,5,5,5,7), respect = FALSE)
par(mar=c(0, 4, 0, 0))
plot(1, type = 'n', axes = FALSE, bty = 'n', ylab = '')
legend('left', , c("X","Y"), bty="n", horiz=T, cex=1.5, col=c("red1","darkblue"), text.col=c("red1","darkblue"), pch=c(1,3), lty=c(2,3), x.intersp=0.4,adj=0.2)
par(mar=c(0, 4, 2, 1), bty = 'o')
plot(a1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2, lwd=2.5, col="red1", lty=2, pch=1, main="A")
lines(a2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
par(xpd=T)
plot(b1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="B")
lines(b2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
plot(c1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="C")
lines(c2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
par(mar=c(4, 4, 2, 1))
plot(d1/1000, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="D")
lines(d2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
mtext("Price", side=2, at=40,line=2.5,cex=1.1)
axis(1, 1:10, cex.axis = 1.4)

âm mưu

Tôi nên lưu ý rằng tôi thực sự đã không nỗ lực để làm cho nó tốt nhất có thể và thay vì tạo biểu đồ giả đầu tiên đó, tôi có thể chỉ cần đặt đủ không gian trong khung đầu tiên. Thật không may, cài đặt mar () cố gắng lấp đầy khung và lề trên ảnh hưởng đến khoảng cách mà nhãn phía trên biểu đồ ở xa nên tôi phải đi và tạo tất cả các nhãn của mình bằng mtext () hoặc văn bản () thay vì chỉ sử dụng bối cảnh chính trong cốt truyện và tôi không cảm thấy muốn làm điều đó


thứ hai +1 cho đồ họa cơ sở badass. Tôi đã cố gắng vô ích để viết một cái gì đó đẹp với lệnh layout (). Tôi sẽ quay lại đây lần sau khi tôi cần sử dụng nó.
Chris Beeley

13

Tôi khuyên bạn nên học gói đồ họa mạng tinh thể. Tôi có thể đến gần với những gì bạn muốn với một vài dòng. Đầu tiên, đóng gói dữ liệu của bạn trong một khung dữ liệu, đại loại như thế này:

dat <- data.frame (x=rep (1:10, 8), y=c(a1, a2, b1, b2, c1, c2, d1, d2),
        var=factor (rep (c("X", "Y"), each=10)),
        graph=factor (rep (c("A", "B", "C", "D"), each=20)))

mang lại:

    x           y var graph
1   1 0.556372979   X     A
2   2 0.754257646   X     A
3   3 0.815432905   X     A
4   4 0.559513013   X     A
5   5 0.763368168   X     A
6   6 0.426415259   X     A
7   7 0.597962532   X     A
8   8 0.723780143   X     A
9   9 0.228920116   X     A
10 10 0.607378894   X     A
11  1 0.865114425   Y     A
12  2 0.919804947   Y     A
13  3 0.437003794   Y     A
14  4 0.203349303   Y     A
15  5 0.620425977   Y     A
16  6 0.703170299   Y     A
17  7 0.174297656   Y     A
18  8 0.698144659   Y     A
19  9 0.732527016   Y     A
20 10 0.778057398   Y     A
21  1 0.355583032   X     B
22  2 0.015765144   X     B
23  3 0.315004753   X     B
24  4 0.257723585   X     B
25  5 0.506324279   X     B
26  6 0.028634427   X     B
27  7 0.475360443   X     B
28  8 0.577119754   X     B
29  9 0.709063777   X     B
30 10 0.308695235   X     B
31  1 0.852567748   Y     B
32  2 0.938889121   Y     B
33  3 0.080869739   Y     B
34  4 0.732318482   Y     B
35  5 0.325673156   Y     B
36  6 0.378161864   Y     B
37  7 0.830962248   Y     B
38  8 0.990504039   Y     B
39  9 0.331377188   Y     B
40 10 0.448251682   Y     B
41  1 0.967255983   X     C
42  2 0.722894624   X     C
43  3 0.039523960   X     C
44  4 0.003774719   X     C
45  5 0.218605160   X     C
46  6 0.722304874   X     C
47  7 0.576140686   X     C
48  8 0.108219812   X     C
49  9 0.258440127   X     C
50 10 0.739656846   X     C
51  1 0.528278201   Y     C
52  2 0.104415716   Y     C
53  3 0.966076056   Y     C
54  4 0.504415150   Y     C
55  5 0.655384900   Y     C
56  6 0.247340395   Y     C
57  7 0.193857228   Y     C
58  8 0.019133583   Y     C
59  9 0.799404908   Y     C
60 10 0.159209090   Y     C
61  1 0.422574508   X     D
62  2 0.823192614   X     D
63  3 0.808715876   X     D
64  4 0.770499188   X     D
65  5 0.049138399   X     D
66  6 0.747017767   X     D
67  7 0.239916970   X     D
68  8 0.152777362   X     D
69  9 0.052862276   X     D
70 10 0.937605577   X     D
71  1 0.850112019   Y     D
72  2 0.675407232   Y     D
73  3 0.273276166   Y     D
74  4 0.455995477   Y     D
75  5 0.695497498   Y     D
76  6 0.688414035   Y     D
77  7 0.454013633   Y     D
78  8 0.874853452   Y     D
79  9 0.568746031   Y     D

Sau đó, sử dụng mạng tinh thể xyplot:

library (lattice)
xyplot (y ~ x | graph, groups=var, data=dat, type="o",
        layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price")

trong đó mang lại một biểu đồ đẹp như:

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

BIÊN TẬP:

Nếu bạn muốn có các biểu tượng và đường kẻ khác nhau và xuất hiện trong truyền thuyết của mình, điều đó trở nên phức tạp, bởi vì bạn thực sự tự xây dựng huyền thoại và bạn phải biết cách lấy màu mắt lưới mặc định nếu bạn không tự ghi đè lên chúng :

my.text <- levels (dat$var)
my.lty <- c(2, 3)
my.pch <- c(1, 2)
my.col <- trellis.par.get ("superpose.symbol")$col[1:2]
xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=my.pch, lty=my.lty,
        main="Main Title", layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price",
        key=list (columns=2, text=list (my.text), points=list (pch=my.pch, col=my.col)))

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

EDIT 2:

Bạn có thể đơn giản hóa mã và biểu đồ, nếu hai danh mục thực sự đơn giản là "X" và "Y":

xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=c("X", "Y"), cex=1.25, lty=c(2, 3),
        layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price")

sẽ sử dụng "X" và "Y" làm ký hiệu điểm. Bạn hoàn toàn không cần một huyền thoại, và sau đó có thể dành nhiều không gian hơn cho chính các biểu đồ. (Mặt khác, bạn có thể không thích giao diện hoặc có thể thấy khó khăn hơn trong việc xác định trung tâm chính xác của điểm, mặc dù đó không phải là vấn đề nhiều như có thể vì đường đi qua từng điểm.)

EDIT 3:

Trên thực tế, bạn nên thêm strip=F, strip.left=T,vào cốt truyện, để đặt các nhãn A, B, C, D, ở bên trái của biểu đồ, giúp bạn có nhiều chỗ hơn trên một biểu đồ dài như thế này:

xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=my.pch, lty=my.lty,
        main="Main Title", layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price",
        strip.left=T, strip=F,
        key=list (columns=2, text=list (my.text), points=list (pch=my.pch, col=my.col),
        lines=list (lty=my.lty, col=my.col)))

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


@Wayne: Tôi đang cố gắng giữ một chú giải trên đầu biểu đồ bằng cách sử dụng auto.key với khoảng trắng = "top", pch = c (1,2), lty = c (2,4), nhưng các giá trị pch và giá trị lty không hoạt động. Hơn nữa, tôi muốn giữ X và Y là ngang trong truyền thuyết. Bạn có thể vui lòng giúp tôi cho điều này.
samarasa

Đúng. Tôi cần sử dụng các giá trị pch khác nhau để đánh lạc hướng X và Y trên một tờ giấy. Tôi có thể sử dụng các giá trị pch khác nhau trong cốt truyện bằng cách thêm đối số pch (1,4) vào xyplot, nhưng nó không phản ánh trên truyền thuyết. Xin vui lòng cho tôi biết làm thế nào tôi có thể sử dụng các giá trị pch khác nhau cho X và Y trong truyền thuyết.
samarasa

OK, tôi đã tìm ra nó khi tôi về nhà và tham khảo cuốn sách. Kiểm tra phiên bản chỉnh sửa.
Wayne

Không vấn đề gì. Tôi nghĩ rằng EDIT 3 của tôi cung cấp cho bạn biểu đồ tốt nhất tương tự (nhưng nhìn đẹp hơn và có nhiều không gian biểu đồ hơn) bản gốc của bạn. Tôi đã không chuyển huyền thoại, điều mà tôi nghĩ là khá đơn giản. Nếu bạn muốn dòng này đi qua điểm trong truyền thuyết, tôi nghĩ bạn sẽ phải đưa nó đến cấp độ phức tạp tiếp theo và thực hiện công cụ draw.key tạo ra các rãnh tùy chỉnh (một gridđiều: lưới và ggplot2 xây dựng trên lưới) .
Wayne

Đúng, bây giờ đồ thị là tốt hơn. Tuy nhiên, sẽ thực sự tốt nếu chúng ta đạt được điểm trong truyền thuyết như chúng ta có với chức năng cốt truyện bình thường.
samarasa

9

Đây là phiên bản của ggplot2giải pháp @ Brandon kết hợp hành vi truyền thuyết mong muốn:

dat <- data.frame (x=rep (1:10, 8), y=runif(80),
        var=factor (rep (c("X", "Y"), each=10)),
        graph=factor (rep (c("A", "B", "C", "D"), each=20)))

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, group = var)) + 
    labs(x = NULL, y = NULL, shape = "", colour = "") + 
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal")

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

Tôi thấy truyền thuyết dễ dàng hơn nhiều ggplot2, nhưng YMMV.

BIÊN TẬP

Giải quyết một vài câu hỏi trong các ý kiến. Để chỉ định đặc biệt điểm hoặc đường dây các loại, bạn sẽ sử dụng scale_aesthetic_manualnơi aestheticlà một trong hai shape, linetypevv Ví dụ:

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, linetype = var, group = var)) + 
    labs(x = NULL, y = NULL, shape = "", colour = "", linetype = "") + 
    scale_shape_manual(values = 4:5) +
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal")

Thay đổi kích thước của các nhãn trục khác nhau được thực hiện bằng cách thay đổi cài đặt trong chủ đề, thường là sử dụng opts(). Ví dụ:

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, linetype = var, group = var)) + 
    labs(x = "X Label", y = "Y Label", shape = "", colour = "", linetype = "") + 
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal",
         axis.text.x = theme_text(size = 15),axis.title.y = theme_text(size = 25, angle = 90))

Bạn nên thực sự đi sâu vào trang web và cuốn sách của anh ấy để biết thêm thông tin.


2
Tôi thường thích ggplot2. Trong thực tế, tôi đã thử nhanh với ggplot2 khi mạng trở nên quá phức tạp và thấy rằng tôi không thể có được huyền thoại để phản ánh đúng các kiểu điểm / đường nếu tôi muốn chọn hình dạng và kiểu đường rõ ràng. Tôi có thể đã làm sai cách, và nó đã xoay sở để làm việc trong biểu đồ, nhưng đánh lừa sự sáng tạo huyền thoại của ggplot. Bạn có thể xem nếu nó hoạt động cho bạn và gửi mã?
Wayne

@Joran: Tôi đã cố gắng tìm ra cách thay đổi các loại linetypes và pointtypes, và màu sắc, nhưng không thành công. Bạn có thể cho chúng tôi biết làm thế nào chúng ta có thể thay đổi linetypes, v.v. Và cũng xin vui lòng cho chúng tôi biết làm thế nào chúng ta có thể tăng kích thước của các phòng thí nghiệm x và y.
samarasa

Tôi đang nghe điện thoại của tôi vào lúc này; nếu @Brandon không chỉnh sửa câu trả lời của anh ấy trước khi tôi về nhà với những gì bạn đang tìm kiếm, tôi sẽ nhận được nó vào tối nay.
Joran

8

Tương tự như câu trả lời của Wayne, tôi cũng sẽ sử dụng một gói khác, cụ thể là ggplot2

library(ggplot2) 

df <- data.frame(
parameter=runif(300),
Time=1:300,
split=sample(c(1:4),300,replace=T),
split2=sample(c(1:2),300,replace=T)
)

ggplot(df, aes(Time, parameter, colour=as.factor(split2))) + 
geom_line() + 
facet_wrap(~split,nrow=4)

Cung cấp cho chúng ta một biểu đồ như:

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


1
Tôi thích các lưới trong ggplot, nhưng có cách nào để tắt nền màu xám nhạt không?
bluepole

1
+ opts(panel.background=theme_blank())
Brandon Bertelsen

1
Nếu bạn muốn thực hiện các thay đổi khác, bạn có thể nhập theme_get()để xem những gì bạn có thể thay đổi. Sau đó, làm theo mô hình tương tự như nhận xét cuối cùng của tôi, đặt chúng=theme_blank()
Brandon Bertelsen

2
Tôi sẽ tự mình làm ggplot2, nhưng nghĩ rằng có lẽ mạng sẽ là một bước dễ dàng hơn. Một trong hai cung cấp một cách có cấu trúc để xếp chồng các biểu đồ như thế này. Tinh chỉnh rất nhiều chi tiết có thể khó khăn, nhưng có được một cái gì đó hấp dẫn và dễ đọc nhanh chóng là dễ dàng. (Mặc dù bạn phải quấn đầu xung quanh để tạo khung dữ liệu phù hợp để lập biểu đồ dữ liệu, thay vì chỉ ném đồ vào biểu đồ.
Wayne

Tôi thấy rằng Hadley đã cung cấp các công cụ thao tác dữ liệu trong các gói khác của mình để tạo khối dữ liệu thành đúng hình. Khi nghi ngờ câu trả lời thường là,melt()
Brandon Bertelsen
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.