2012-09-24 34 views
6

Tôi muốn vẽ ba đồ thị theo bố cục 1x3. Chỉ đồ thị đầu tiên cần phải có nhãn trục dọc, nhưng tôi muốn tất cả ba khu vực âm mưu có cùng kích thước chính xác. Điều này sẽ không thành vấn đề nếu không có hoặc tất cả các đồ thị có nhãn trục. Nhưng làm cách nào để có được tất cả ba biểu đồ có cùng kích thước khi một biểu tượng có nhãn trục và hai biểu đồ kia thì không? Tôi đang cố gắng làm điều này trong đồ họa cơ bản bởi vì đó là những gì tôi biết rõ nhất, nhưng tôi rất vui khi sử dụng lưới hoặc ggplot2 nếu chúng cung cấp các phương pháp tốt hơn để giải quyết vấn đề của tôi.Làm thế nào để tạo nhiều ô, mỗi ô có cùng kích thước vùng ô, khi chỉ có một ô có nhãn trục?

Dưới đây là một số dữ liệu giả, mã âm mưu của tôi, và cốt truyện riêng của mình:

# Fake Data 
data = structure(list(y1 = 1:5, y2 = c(1.2, 2.4, 3.6, 4.8, 6), y3 = c(1.44, 
2.88, 4.32, 5.76, 7.2)), .Names = c("y1", "y2", "y3"), 
row.names = c("I needed 12 units for financial aid", 
       "I couldn't find any other open classes", 
       "I might be adding a major or minor", 
       "The class seemed interesting", "The class fit into my schedule" 
), class = "data.frame") 

# Plotting code 
par(mar=c(5,15,4,1)) 
par(mfrow=c(1,3)) 
barplot(data$y1,names.arg=row.names(data), horiz=TRUE,las=1, + 
     xlim=c(0,8), main="Group 1") 
par(mar=c(5,1,4,1)) 
barplot(data$y2,names.arg=row.names(data), horiz=TRUE,las=1, + 
     axisnames=FALSE, xlim=c(0,8), main="Group 2") 
barplot(data$y3,names.arg=row.names(data), horiz=TRUE,las=1, + 
     axisnames=FALSE, xlim=c(0,8), main="Group 3") 

# Reset plot options back to defaults 
par(mfrow=c(1,1) 
par(mar=c(5,4,4,2)+0.1) 

[Cập nhật: tôi đã chọn câu trả lời trực tiếp nhất đã trả lời câu hỏi của tôi, mà là trong đồ họa cơ bản, nhưng tôi khuyên bạn nên nhìn vào các giải pháp khác là tốt, khi họ thấy làm thế nào để làm điều tương tự trong latticeggplot2.]

enter image description here

Trả lời

8

Đối với đồ họa cơ bản bạn muốn sử dụng một lề bên ngoài chứ không phải là lợi nhuận thông thường. Chỉ cần thay thế par(mar=c(5,15,4,1)) đầu tiên bằng par(oma=c(0,15,0,0)) và xóa cuộc gọi thứ hai thành par và các ô sẽ lấy khoảng trống bằng nhau (và các nhãn trục sẽ dính vào lề ngoài bên trái).

+0

Thay đổi cài đặt 'oma' có vẻ như" đặt lại "khu vực ô. Ví dụ, nếu tôi tạo cốt truyện đầu tiên với 'oma = c (0,15,0,0)' và sau đó gọi 'par (oma = c (0,0,0,0))' theo sau bởi 'plot (. ..) ', tôi kết thúc với hai ô riêng biệt, thay vì hai ô trên cùng một" trang ". Có cách nào để nói với R để giữ cùng một khu vực âm mưu 1x3 sau âm mưu đầu tiên, mặc dù tôi đã gọi là 'oma'? – eipi10

+0

@ eipi10 bạn chỉ nên đặt tham số 'oma' một lần, không thay đổi nó giữa các khung riêng lẻ. –

+0

Điều đó có hiệu quả, cảm ơn. Trong sự tò mò, tại sao bạn không phải đặt lại 'oma' trở lại c (0,0,0,0) sau khi vẽ cốt truyện đầu tiên?Ngoài ra, để tham khảo trong tương lai, trong phạm vi có những trường hợp mà người ta muốn thay đổi thông số đồ họa giữa các ô, có cách nào để ngăn R khỏi việc thiết lập lại vùng biểu đồ không? – eipi10

6

tôi có thể pr obably mảnh một cái gì đó với nhau bằng layout, nhưng đó chỉ là nhanh hơn để làm điều đó bằng cách sử dụng tính năng faceting của ggplot2:

data$grp <- rownames(data) 
datam <- melt(data,id.vars = "grp") 
ggplot(datam,aes(x = grp,y = value)) + 
    facet_wrap(~variable,nrow = 1) + 
    geom_bar(stat = "identity") + 
    coord_flip() 

enter image description here

7

Cách đơn giản nhất với đồ họa cơ bản có lẽ là để làm cho họ tất cả không có nhãn trục y và sau đó thêm nhãn riêng biệt trong bảng điều khiển bổ sung ở bên trái của cả ba nhãn.

Nhưng các tác vụ như thế này là một trong những lý do tại sao lattice (và ggplot, cho vấn đề đó) được phát minh. Bạn cũng có thể xem xét một dấu chấm, đặc biệt nếu bạn là một fan hâm mộ của William Cleveland.

library(reshape2) 
d2 <- data 
d2$q <- rownames(d2) 
d2 <- melt(d2, measure.vars=1:3, id.vars=4) 
d2$q <- factor(d2$q, levels=rownames(data)) 

library(lattice) 
barchart(q ~ value|variable, data=d2) 
dotplot(q ~ value|variable, data=d2) 

enter image description here enter image description here

4

Mở rộng về câu trả lời Greg Snow (trong bối cảnh theo dõi câu hỏi của bạn) đây là một chỉnh sửa tối thiểu của mã của bạn nào đó với đồ họa cơ sở:

op <- par(oma=c(0,15,0,0), mfrow=c(1,3), mar=c(5,1,4,1)) 
barplot(data$y1,names.arg=row.names(data), horiz=TRUE,las=1, xlim=c(0,8), main="Group 1") 
barplot(data$y2,names.arg=row.names(data), horiz=TRUE,las=1, axisnames=FALSE, xlim=c(0,8), main="Group 2") 
barplot(data$y3,names.arg=row.names(data), horiz=TRUE,las=1, axisnames=FALSE, xlim=c(0,8), main="Group 3") 
par(op) 

chìa khóa để tránh các "thiết lập lại" bạn đề cập đến việc chỉ định tất cả các thông số trong một cuộc gọi duy nhất đến mệnh đề()

Các vấn đề liên quan