2013-03-05 31 views

Trả lời

6

Tôi đã làm điều này bằng một cái gì đó như thế này:

# Making some fake data 
plot1 <- data.frame(x=sample(x=1:10,10,replace=FALSE), 
        y=sample(x=1:10,10,replace=FALSE)) 
plot2 <- data.frame(x=sample(x=1:10,10,replace=FALSE), 
        y=sample(x=1:10,10,replace=FALSE)) 
plot3 <- data.frame(x=sample(x=1:10,10,replace=FALSE), 
        y=sample(x=1:10,10,replace=FALSE)) 

layout(matrix(c(2,1,1,3,1,1),2,3,byrow=TRUE)) 
plot(plot1$x,plot1$y) 
plot(plot2$x,plot2$y) 
plot(plot3$x,plot3$y) 

Các matrixlayout lệnh cho phép bạn sắp xếp nhiều đồ thị thành một cốt truyện duy nhất. Về cơ bản, bạn đặt số lượng của mỗi ô (theo thứ tự bạn sẽ gọi nó) vào mỗi ô, và sau đó bất kỳ sự sắp xếp nào kết thúc là cách các ô của bạn được đặt ra. Ví dụ, trong trường hợp trên, matrix(c(2,1,1,3,1,1),byrow=TRUE) kết quả trong một ma trận mà trông như thế này:

 [,1] [,2] [,3] 
[1,] 2 1 1 
[2,] 3 1 1 

Vì vậy, bạn có thể kết thúc với một cái gì đó như thế này:

Example Multiplot

Edited thêm:

Được rồi, vì vậy, nếu bạn muốn tích hợp một ô trong góc, bạn có thể thực hiện điều đó bằng cách sử dụng cùng lệnh layout bằng cách thay đổi ma trận. Ví dụ, đây là đoạn mã khác nhau:

layout(matrix(c(1,1,2,1,1,1),2,3,byrow=TRUE)) 
plot1 <- data.frame(x=1:10,y=c(9,10,8,7,3,4,1,2,5,6)) 
plot2 <- data.frame(x=1:10,y=c(6,7,5,1,2,8,3,10,9,4)) 
plot(plot1$x,plot1$y,type="o",col="red") 
plot(plot2$x,plot2$y,type="o",xlab="",ylab="",main="",sub="",col="blue") 

Và ma trận kết quả là:

 [,1] [,2] [,3] 
[1,] 1 1 2 
[2,] 1 1 1 

Cốt truyện mà đi ra trông như thế này:

Example Multiplot 2

+0

@TAReham cảm ơn và nếu tôi muốn có một âm mưu nhỏ bên trong khác? –

+0

@TAReham cho axample một âm mưu nhỏ chỉ topleft và bên trong cốt truyện khác? –

+0

Đã chỉnh sửa câu trả lời để hiển thị thay thế. – TARehman

9

Tôi biết câu hỏi này đã bị đóng, nhưng tôi đang ném ví dụ này lên cho hậu thế.

Bạn có thể thực hiện các cách trực quan hóa tùy chỉnh như thế này một cách dễ dàng với gói 'lưới' cơ sở sau khi bạn nhận được các khái niệm cơ bản. Dưới đây là ví dụ nhanh về một số chức năng tùy chỉnh mà tôi sử dụng cùng với bản trình diễn vẽ dữ liệu.

example plot


chức năng chỉnh


# Function to initialize a plotting area. 
init_Plot <- function(
    .df, 
    .x_Loc, 
    .y_Loc, 
    .justify, 
    .width, 
    .height 
    ){ 

    # Initialize plotting area to fit data. 
    # We have to turn off clipping to make it 
    # easy to plot the labels around the plot. 
    pushViewport(viewport(xscale=c(min(.df[,1]), max(.df[,1])), yscale=c(min(0,min(.df[,-1])), max(.df[,-1])), x=.x_Loc, y=.y_Loc, width=.width, height=.height, just=.justify, clip="off", default.units="npc")) 

    # Color behind text. 
    grid.rect(x=0, y=0, width=unit(axis_CEX, "lines"), height=1, default.units="npc", just=c("right", "bottom"), gp=gpar(fill=space_Background, col=space_Background)) 
    grid.rect(x=0, y=1, width=1, height=unit(title_CEX, "lines"), default.units="npc", just=c("left", "bottom"), gp=gpar(fill=space_Background, col=space_Background)) 

    # Color in the space. 
    grid.rect(gp=gpar(fill=chart_Fill, col=chart_Col)) 
} 

# Function to finalize and label a plotting area. 
finalize_Plot <- function(
    .df, 
    .plot_Title 
    ){ 

    # Label plot using the internal reference 
    # system, instead of the parent window, so 
    # we always have perfect placement. 
    grid.text(.plot_Title, x=0.5, y=1.05, just=c("center","bottom"), rot=0, default.units="npc", gp=gpar(cex=title_CEX)) 
    grid.text(paste(names(.df)[-1], collapse=" & "), x=-0.05, y=0.5, just=c("center","bottom"), rot=90, default.units="npc", gp=gpar(cex=axis_CEX)) 
    grid.text(names(.df)[1], x=0.5, y=-0.05, just=c("center","top"), rot=0, default.units="npc", gp=gpar(cex=axis_CEX)) 

    # Finalize plotting area. 
    popViewport() 
} 

# Function to plot a filled line chart of 
# the data in a data frame. The first column 
# of the data frame is assumed to be the 
# plotting index, with each column being a 
# set of y-data to plot. All data is assumed 
# to be numeric. 
plot_Line_Chart <- function(
    .df, 
    .x_Loc, 
    .y_Loc, 
    .justify, 
    .width, 
    .height, 
    .colors, 
    .plot_Title 
    ){ 

    # Initialize plot. 
    init_Plot(.df, .x_Loc, .y_Loc, .justify, .width, .height) 

    # Calculate what value to use as the 
    # return for the polygons. 
    y_Axis_Min <- min(0, min(.df[,-1])) 

    # Plot each set of data as a polygon, 
    # so we can fill it in with color to 
    # make it easier to read. 
    for (i in 2:ncol(.df)){ 
     grid.polygon(x=c(min(.df[,1]),.df[,1], max(.df[,1])), y=c(y_Axis_Min,.df[,i], y_Axis_Min), default.units="native", gp=gpar(fill=.colors[i-1], col=.colors[i-1], alpha=1/ncol(.df))) 
    } 

    # Draw plot axes. 
    grid.lines(x=0, y=c(0,1), default.units="npc") 
    grid.lines(x=c(0,1), y=0, default.units="npc") 

    # Finalize plot. 
    finalize_Plot(.df, .plot_Title) 

} 

đang Demo


grid.newpage() 

# Specify main chart options. 
chart_Fill = "lemonchiffon" 
chart_Col = "snow3" 
space_Background = "white" 
title_CEX = 1.4 
axis_CEX = 1 

plot_Line_Chart(data.frame(time=1:1860, EuStockMarkets)[1:5], .x_Loc=1, .y_Loc=0, .just=c("right","bottom"), .width=0.9, .height=0.9, c("dodgerblue", "deeppink", "green", "red"), "EU Stocks") 

# Specify sub-chart options. 
chart_Fill = "lemonchiffon" 
chart_Col = "snow3" 
space_Background = "lemonchiffon" 
title_CEX = 0.8 
axis_CEX = 0.7 

for (i in 1:4){ 
    plot_Line_Chart(data.frame(time=1:1860, EuStockMarkets)[c(1,i + 1)], .x_Loc=0.15*i, .y_Loc=0.8, .just=c("left","top"), .width=0.1, .height=0.1, c("dodgerblue", "deeppink", "green", "red")[i], "EU Stocks") 
} 
+0

Wow. Điều đó chắc chắn làm cho phản ứng của tôi trông khá yếu so với việc so sánh. :) – TARehman

+0

@TARehman Sự khác biệt chính, mặc dù, là phương pháp 'par' trong câu trả lời của bạn có thể chấp nhận các chức năng vẽ sơ đồ cơ sở, trong khi phương pháp 'lưới' sẽ yêu cầu bạn chỉ định phương thức vẽ của riêng bạn. Đó là chủ yếu là một câu hỏi về thời gian và chỉ cần làm thế nào tùy chỉnh cốt truyện của bạn cần phải được. – Dinre

+1

Câu hỏi không được đóng và OP chắc chắn có khả năng thay đổi lựa chọn của họ khi câu trả lời nhận được dấu kiểm. – Dason

6

Bạn cũng có thể sử dụng par(fig=..., new=TRUE).

x <- rnorm(100) 
hist(x, col = "light blue") 
par(fig = c(.7, .95, .7, .95), mar=.1+c(0,0,0,0), new = TRUE) 
qqnorm(x, axes=FALSE, xlab="", ylab="", main="") 
qqline(x, col="blue", lwd=2) 
box() 

smaller plot in a corner

+0

Tôi thích tùy chọn này rất nhiều cho nó đơn giản và khả năng sử dụng các chức năng âm mưu cơ bản. Là một người sử dụng 'lưới', tôi không tự mình sử dụng nó, nhưng tôi sẽ phải nhớ điều này cho những người khác hỏi. Cảm ơn bạn đã chỉ ra điều này. – Dinre

6

Các subplot chức năng trong gói TeachingDemos thực hiện chính xác này cho đồ họa cơ bản.

Tạo ô có kích thước đầy đủ, sau đó gọi subplot bằng lệnh vẽ âm mưu mà bạn muốn trong subplot và chỉ định vị trí của subplot. Vị trí có thể được xác định bằng từ khóa như "topleft" hoặc bạn có thể cho nó tọa độ trong hệ thống tọa độ người dùng lô hiện tại.

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