2013-02-23 42 views
14

Tôi có một số lượng lớn các ô nhỏ cần được đặt trong ô lớn hơn và sắp xếp các ô nhỏ vào và kết nối chúng với các đường. Một ví dụ nhỏ sẽ trông giống như sau:Sắp xếp số lượng lớn các ô và kết nối với các đường trong r

A đến L là các ô độc lập. Các vị trí của họ được đưa ra.

enter image description here

lưới âm mưu phối: PlotgridX và plotgridY có thể quyết định khi nào âm mưu nhỏ cần phải được tập trung

plotcord <- data.frame (
plotname = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"), 
plotgridX = c(1.5, 2, 5, 5.5, 1.75, 5.25, 8 , 1 , 2, 3.5, 6, 7.5), 
plotgridY = c(3, 3, 3, 3,  2 , 2, 2, 2 , 1, 1, 1, 1)) 


    plotname plotgridX plotgridY 
1   A  1.50   3 
2   B  2.00   3 
3   C  5.00   3 
4   D  5.50   3 
5   E  1.75   2 
6   F  5.25   2 
7   G  8.00   2 
8   H  1.00   2 
9   I  2.00   1 
10  J  3.50   1 
11  K  6.00   1 
12  L  7.50   1 

Các đường kết nối được quyết định bởi các khung dữ liệu sau:

connectd <- data.frame (id = c( "E", "F", "I", "J", "K", "L"), 
         parent1 = c("A", "C", "H", "E" ,"E", "F"), 
         parent2 = c("B", "D", "E", "F", "F", "G")) 
connectd 
    id parent1 parent2 
1 E  A  B 
2 F  C  D 
3 I  H  E 
4 J  E  F 
5 K  E  F 
6 L  F  G 

Ví dụ, ở đây hình E nên được kết nối với cha mẹ của nó1 "A" và cha mẹ 2 "B" con số cùng một lúc "A", "B" nên được kết nối để làm cho nó "T hình" kết nối. Tương tự cho các id khác.

Mặc dù tôi có các chi tiết khác để vẽ trong mỗi âm mưu phụ, cũng như bằng chứng của khái niệm tôi có thể thích để vẽ một hình chữ nhật withing mỗi lô với tên n1 và n2, để thực hiện một âm mưu như sau: enter image description here

+2

Điều này chắc chắn trông giống như một phả hệ. Bạn đã xem gói kinship2 chưa? –

+1

bạn có thể vẽ các đường bằng ggplot2 và đặt các ô nhỏ bằng 'annotate_custom'. – baptiste

+0

@DWin chắc chắn được sắp xếp làm phả hệ nhưng mỗi hình chữ nhật là một cốt truyện, không thể có trên bất kỳ gói vẽ phả hệ nào như kinship2 – jon

Trả lời

10

Tôi đang viết câu trả lời này lên, một phần cho hậu thế, và một phần vì tôi đã có nghĩa là để viết lên một số chức năng như thế này đối với một số người khác đã cố gắng để có được vào hình ảnh tùy chỉnh trong R.

nền

trong R, nhiều người một cách đúng đắn để lại căn cứ chức năng âm mưu và bắt đầu chuyển sang các gói wrapper linh hoạt hơn, 'mạng' và ' ggplot2 '. Đây là những công cụ mạnh mẽ để nhanh chóng khám phá dữ liệu của bạn bằng cách áp dụng các lớp logic trên đầu trang của một cốt truyện. Các gói sau đó xử lý tất cả các lớp và tạo ra một cửa sổ các ô, sắp xếp một cách thích hợp. Những gói này là tuyệt vời, và tôi khuyên mọi người dùng R nên học ít nhất một trong số họ.

Một lưu ý trước, là các gói 'mạng' và 'ggplot2' thực sự nhiều hơn cho việc khám phá dữ liệu hơn là trực quan hóa dữ liệu thông minh. Khi tạo một trực quan hóa dữ liệu tùy chỉnh, các gói này đưa ra quá nhiều quyết định cho bạn, bởi vì đó là những gì mà trình bao bọc dành cho: lấy một số quyết định ra khỏi bàn tay của bạn.

Hiển thị tùy chỉnh? Nhập 'lưới'

Gói cơ sở 'lưới' là bản vẽ cuối cùng linh hoạt, một phần vì nó mở rộng chức năng của các chức năng vẽ sơ đồ nền, thay vì gói chúng. Với chức năng 'lưới', chúng ta có thể tạo ra các đối tượng trực quan bằng cách sử dụng nhiều đơn vị khác nhau để sắp xếp và định cỡ, và (điều này thực sự quan trọng), chúng ta có khả năng sử dụng các biện pháp cho neo của đối tượng. Cuốn sách của Paul Murrell, "Đồ họa R", là một tài nguyên tuyệt vời nếu bạn muốn học. Một bản sao của nó nằm trên bàn của tôi.

Nếu bạn đã từng sử dụng chương trình vẽ đồ họa vector (như Illustrator hoặc Inkscape), có thể bạn đã biết những gì tôi đang nói đến khi tôi đề cập đến các giải thích. Đây là khả năng xếp hàng các mục bằng cách tham khảo vị trí của các mục khác. Tôi sẽ nói về điều này nhiều hơn, nhưng tôi có thể nói về nó cả ngày. Hãy chuyển sang quy trình.

Quá trình

Bây giờ, tôi cần lời nói đầu này bằng cách nói rằng nó đã cho tôi khoảng hai giờ để viết thư viện chức năng, và khoảng 5 phút để viết mã demo. Tôi sẽ sử dụng thư viện hàm trong tương lai như một công cụ đào tạo và bất kỳ ai cũng có thể sử dụng/sửa đổi nó.

quá trình

Các 'lưới' làm việc trong ba bước cơ bản:

  1. Tạo một khung nhìn
  2. Vẽ một số đối tượng
  3. Pop viewport

Khi đưa ra một khung nhìn, chúng tôi sử dụng ' pushViewport 'để đẩy đối tượng' viewport ', giống như vậy:

pushViewport(viewport(x=0, y=1, xscale=c(1, 10), yscale=c(0, 100), width=0.25, height=0.25, default.units="npc", just=c("left","bottom"), clip="off")) 

Chế độ xem cơ bản có bộ đơn vị "npc" trong đó x chuyển từ 0 sang 1, trái sang phải và y chuyển từ 0 sang 1, từ dưới lên trên. Điều này có nghĩa là nguồn gốc ở góc dưới bên trái. Chế độ xem ở trên được tạo thành một phần tư cốt truyện ở góc dưới bên trái. Tuy nhiên, khi chúng tôi chỉ định "xscale" và "yscale", chúng tôi có khả năng tham chiếu các đơn vị "gốc" khi vẽ đối tượng. Điều này có nghĩa là chúng tôi có thể sử dụng đơn vị "gốc" để vẽ dữ liệu và sử dụng đơn vị "npc" khi vẽ những thứ như trục và nhãn.

Khi vẽ đối tượng, chúng tôi sử dụng các chức năng như 'grid.lines', 'grid.polygon', 'grid.points', 'grid.circle', v.v. Mỗi hình ảnh tôi từng tạo ra đã sử dụng các đối tượng này. Khi bạn vẽ dữ liệu bằng cách chỉ định các đối tượng này bằng tay, bạn sẽ có được một lượng điều khiển khổng lồ. Điền vào một biểu đồ đường là một trong những ví dụ rõ ràng nhất về khả năng được thêm vào. Một vùng đầy chỉ là một đa giác với các điểm của đa giác được chỉ định bởi dữ liệu và với hai điểm neo được thêm vào. Tôi sử dụng điều này để làm nổi bật các khu vực của biểu đồ dạng đường hoặc để dễ đọc hơn nhiều dòng trên cùng một biểu đồ.

Bạn cũng có thể sáng tạo, ví dụ: tạo các thanh không phải là hình chữ nhật hoặc kết hợp nhiều ô theo cách tinh vi hơn. Tôi và một số người khác gần đây đã chạy một trò chơi đi bộ theo chủ đề khoa học viễn tưởng, và chúng tôi đã sử dụng biểu đồ tùy chỉnh (được tạo bằng 'lưới') để hiển thị hiệu suất cuối cùng của chúng tôi.Biểu đồ kết hợp số ngày trong nhóm "người sống sót" dưới dạng trục thời gian, hiển thị trình phát so với các bước của đối phương mỗi ngày dưới dạng biểu đồ thanh và hiển thị các trình phát tích lũy và bước của kẻ thù mỗi ngày dưới dạng biểu đồ đường kẻ đầy. Tôi sẽ bị ép cứng để tạo ra một hình ảnh có thể so sánh được bằng cách sử dụng các gói 'mạng' hoặc 'ggplot2'.

Đây là một mẫu của một trong các bảng xếp hạng (sans tên người chơi thực tế cuộc sống), để cung cấp cho một ý tưởng về chỉ cách linh hoạt 'lưới' hình ảnh có thể là:

Sample sophisticated chart

Một bằng chứng của khái niệm cho câu hỏi

Bây giờ để giải quyết cụ thể câu hỏi đặt ra bởi OP. Trong câu hỏi, OP ngụ ý rằng anh ta sẽ vẽ đồ thị bên trong mỗi khu vực. Điều này có thể trở nên phức tạp khi sử dụng các gói âm mưu dựng sẵn, bởi vì hầu hết các chức năng âm mưu sẽ ghi đè lên bất kỳ thông số lô cốt nào mà bạn đã thiết lập. Thay vào đó, nó là đáng tin cậy hơn để sử dụng một cái gì đó giống như các cơ sở 'lưới' chức năng để xác định khu vực âm mưu và sau đó rút ra các đối tượng dữ liệu cần thiết trong khung nhìn.

Để tránh làm việc quá khó, trước tiên tôi đã viết thư viện hàm tùy chỉnh để đặt các tham số biểu đồ khác nhau và vẽ từng loại biểu đồ cho tôi. Tôi không thích gỡ lỗi mã, do đó, chức năng là cách tôi làm việc thông qua những thứ từng mảnh. Mỗi khi tôi nhận được một đoạn mã đúng, tôi ném nó vào một hàm để sử dụng sau này.

Mã có thể hơi phức tạp, nhưng hãy nhớ ba bước 'lưới': đẩy chế độ xem, vẽ, cửa sổ xem pop. Đây là những gì mỗi chức năng đang làm. Để giới thiệu tác phẩm, tôi đã thực hiện bốn chức năng vẽ khác nhau: biểu đồ đường kẻ, biểu đồ phân tán, biểu đồ và bản vẽ hộp theo đề xuất của OP. Mỗi hàm đủ linh hoạt để chứa nhiều tập hợp các giá trị dữ liệu trong mỗi biểu đồ, thiết lập các giá trị alpha để bù và cho phép chúng ta thấy các giá trị được vẽ trên đầu trang của mỗi giá trị khác. Trong một trường hợp như thế này, bạn chỉ làm cho các chức năng của bạn linh hoạt như bạn cần, vì vậy tôi đã thực hiện một phím tắt trên các dòng và vẽ chúng từ một chút mã trong bản demo đã tạo ra rất nhiều giả định. Tuy nhiên, tôi vẫn vẽ nó với mã điều khiển logic để giới thiệu cách vẽ các đối tượng phức tạp hơn với logic đơn giản.

Đây là kết quả của mã demo, sử dụng một số bộ dữ liệu R built-in cho dữ liệu dễ dàng (EuStockMarkets, nottem, sunspots.month):

Chart demo of grid functionality


Tuỳ chỉnh chức năng thư viện :


library(grid) 

# Specify general chart options. 
chart_Fill = "lemonchiffon" 
chart_Col = "snow3" 
space_Background = "white" 
title_CEX = 0.8 
axis_CEX = 0.6 
chart_Width <- 3/3 
chart_Height <- 2/5 

# 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="native")) 

    # 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) 

} 

# Function to plot a scatterplot of 
# the data in a data frame. The 
# assumptions are the same as 'plot_Line_Chart'. 
plot_Scatterplot <- function(
    .df, 
    .x_Loc, 
    .y_Loc, 
    .justify, 
    .width, 
    .height, 
    .colors, 
    .plot_Title 
    ){ 

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

    # Plot each set of data as colored points. 
    for (i in 2:ncol(.df)){ 
     grid.points(x=.df[,1], y=.df[,i], pch=19, size=unit(1, "native"), default.units="native", gp=gpar(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) 

} 

# Function to plot a histogram of 
# all the columns in a data frame, 
# except the first, which is assumed to 
# be an index. 
plot_Histogram <- function(
    .df, 
    .x_Loc, 
    .y_Loc, 
    .justify, 
    .width, 
    .height, 
    .colors, 
    .plot_Title, 
    ... 
    ){ 

    # Create a list containing the histogram 
    # data for each data column and calculate 
    # data ranges. Any extra parameters 
    # specified will pass to the 'hist' function. 
    hist_Data <- list() 
    hist_Count_Range <- c(0,NA) 
    hist_Breaks_Range <- c(NA,NA) 
    for (i in 2:ncol(.df)){ 
     hist_Data[[i]] <- hist(.df[,i], plot=FALSE, ...) 
     hist_Count_Range[2] <- max(max(hist_Data[[i]]$counts), hist_Count_Range[2], na.rm=TRUE) 
     hist_Breaks_Range <- c(min(min(hist_Data[[i]]$breaks), hist_Breaks_Range[1], na.rm=TRUE), max(max(hist_Data[[i]]$breaks), hist_Breaks_Range[2], na.rm=TRUE)) 
    } 


    # Initialize plotting area to fit data. 
    # We are doing this in a custom way to 
    # allow more flexibility than built into 
    # the 'init_Plot' function. 
    # We have to turn off clipping to make it 
    # easy to plot the labels around the plot. 
    pushViewport(viewport(xscale=hist_Breaks_Range, yscale=hist_Count_Range, x=.x_Loc, y=.y_Loc, width=.width, height=.height, just=.justify, clip="off", default.units="native")) 

    # 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)) 


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

    # Plot each set of data as a histogram. 
    for (i in 2:ncol(.df)){ 
     grid.rect(x=hist_Data[[i]]$mids, y=0, width=diff(hist_Data[[i]]$mids[1:2]), height=hist_Data[[i]]$counts, default.units="native", just=c("center","bottom"), gp=gpar(fill=.colors[i-1], col=.colors[i-1], alpha=1/ncol(.df))) 
    } 

    # 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)) 

    # Finalize plotting area. 
    popViewport() 
} 

draw_Sample_Box <- function(
    .x_Loc, 
    .y_Loc, 
    .x_Scale, 
    .y_Scale, 
    .justify, 
    .width, 
    .height, 
    .colors, 
    .box_X, 
    .box_Y, 
    .plot_Title 
    ){ 

    pushViewport(viewport(xscale=.x_Scale, yscale=.y_Scale, x=.x_Loc, y=.y_Loc, width=chart_Width, height=chart_Height, just=.justify, clip="off", default.units="native")) 

    # Color behind text. 
    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)) 

    # Label plot. 
    grid.text(.plot_Title, x=0.5, y=1.05, just=c("center","bottom"), rot=0, default.units="npc", gp=gpar(cex=title_CEX)) 

    # Draw box and label points. 
    grid.polygon(x=.box_X, y=.box_Y, default.units="native", gp=gpar(fill=.colors[1], col=.colors[2])) 
    grid.text(paste(.plot_Title, 1, sep=""), x=min(.box_X), y=min(.box_Y), default.units="native", just=c("right","top"), gp=gpar(cex=0.5)) 
    grid.text(paste(.plot_Title, 2, sep=""), x=max(.box_X), y=min(.box_Y), default.units="native", just=c("left","top"), gp=gpar(cex=0.5)) 

    # Finalize plot. 
    popViewport() 
} 

Demo đang:


# Draw twelve independent charts as 
# a demo and connect with lines similar 
# to a heiritage chart. 
grid.newpage() 

# Initialize a viewport to make our locations 
# easier to map. 
pushViewport(viewport(x=0, y=0, width=1, height=1, just=c("left","bottom"), xscale=c(0,10), yscale=c(0,4))) 

# Color background of overall plot. 
grid.rect(gp=gpar(fill=space_Background, col=space_Background)) 

# Store plot locations for convenience. 
plot_Loc <- data.frame(x=c(2,4,6,8,1,3,7,9,2,4,6,8), y=c(3,3,3,3,2,2,2,2,1,1,1,1)) 

# Draw connecting lines. 
connections <- data.frame(a=c(1, 3, 5, 6, 7, 1, 3, 5, 7, 6), b=c(2, 4, 6, 7, 8, 2, 4, 6, 8, 7), c=c(NA, NA, NA, NA, NA, 6, 7, 9, 12, 10), d=c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 11)) 
for (i in 1:nrow(connections)){ 
    if (is.na(connections$c[i])){ 
     grid.lines(x=plot_Loc$x[unlist(connections[i,1:2])], y=plot_Loc$y[unlist(connections[i,1:2])], default.units="native") 
    } else if (is.na(connections$d[i])) { 
     grid.lines(x=median(plot_Loc$x[unlist(connections[i,1:2])]), y=plot_Loc$y[unlist(connections[i,2:3])], default.units="native") 
    } else { 
     grid.lines(x=median(plot_Loc$x[unlist(connections[i,1:2])]), y=c(plot_Loc$y[connections[i,2]], median(plot_Loc$y[unlist(connections[i,2:3])])), default.units="native") 
     grid.lines(x=plot_Loc$x[unlist(connections[i,3:4])], y=median(plot_Loc$y[unlist(connections[i,2:3])]), default.units="native") 
     grid.lines(x=plot_Loc$x[connections[i,3]], y=c(median(plot_Loc$y[unlist(connections[i,2:3])]), plot_Loc$y[connections[i,3]]), default.units="native") 
     grid.lines(x=plot_Loc$x[connections[i,4]], y=c(median(plot_Loc$y[unlist(connections[i,2:3])]), plot_Loc$y[connections[i,4]]), default.units="native") 
    } 
} 


# Draw four independent line charts. 
p <- 1 
plot_Line_Chart(data.frame(time=1:1860, EuStockMarkets)[1:3], .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("dodgerblue", "deeppink"), "EU Stocks") 
p <- 2 
plot_Line_Chart(data.frame(time=1:1860, EuStockMarkets)[c(1,4,5)], .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("green", "purple"), "EU Stocks") 
p <- 3 
plot_Line_Chart(data.frame(time=1:(12*20), sunspots=sunspot.month[(171*12+1):(171*12+12*20)]), .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("darkgoldenrod"), "Sunspots") 
p <- 4 
plot_Line_Chart(data.frame(time=1:(12*20), temp=nottem), .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("red"), "Nottem") 

# Draw four independent scatterplots. 
p <- 5 
plot_Scatterplot(data.frame(time=1:(1860 + 1 - 1000), DAX=rowMeans(embed(EuStockMarkets[,1], 1000)), FTSE=rowMeans(embed(EuStockMarkets[,4], 1000))), .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("deeppink", "purple"), "Smooth") 
p <- 6 
plot_Scatterplot(data.frame(time=1:1860, EuStockMarkets)[c(1,2,5)], .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("deeppink", "purple"), "EU Stocks") 
p <- 9 
plot_Scatterplot(data.frame(time=1:(1860 + 1 - 20), DAX=rowMeans(embed(EuStockMarkets[,1], 20)), FTSE=rowMeans(embed(EuStockMarkets[,4], 20))), .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("deeppink", "purple"), "Smooth*20") 
p <- 10 
plot_Scatterplot(data.frame(time=1:(1860 + 1 - 100), DAX=rowMeans(embed(EuStockMarkets[,1], 100)), FTSE=rowMeans(embed(EuStockMarkets[,4], 100))), .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("deeppink", "purple"), "Smooth*100") 


# Draw two independent histograms. 
p <- 7 
plot_Histogram(data.frame(time=1:(12*20), sunspots=sunspot.month[(171*12+1):(171*12+12*20)]), .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("darkgoldenrod"), "Sunspots", breaks=6) 
p <- 8 
plot_Histogram(data.frame(time=1:(12*20), temp=nottem), .x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .just=c("center","center"), .width=chart_Width, .height=chart_Height, c("red"), "Nottem", breaks=6) 

# Draw sample objects in two charts spaces. 
p <- 11 
draw_Sample_Box(.x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .x_Scale=c(0,10), .y_Scale=c(-10,0), .justify=c("center","center"), .width=chart_Width, .height=chart_Height, .colors=c("dodgerblue","blue"), .box_X=c(4,6,6,4), .box_Y=c(-4,-4,-5,-5), .plot_Title="K") 
p <- 12 
draw_Sample_Box(.x_Loc=plot_Loc$x[p], .y_Loc=plot_Loc$y[p], .x_Scale=c(-1,1), .y_Scale=c(0,1), .justify=c("center","center"), .width=chart_Width, .height=chart_Height, .colors=c("dodgerblue","blue"), .box_X=c(-0.5,0,0,-0.5), .box_Y=c(0.8,0.8,0.7,0.7), .plot_Title="L") 
11

EDIT sau khi bắt đầu thưởng:

  • chage làm thế nào để tính toán tọa độ của dòng: không cần phải sử dụng kết hợp
  • Thay đổi cách vẽ teh gia nhập dòng: dòng khá được kết nối.

enter image description here

Trước hết tôi cần phải chuyển đổi dữ liệu kết nối của bạn từ điểm nhãn để phối hợp điểm (x, y)

## here the edit 
dat.lines <- do.call(cbind,apply(connectd,2, 
           function(x){ 
            id <- match(x,plotcord$plotname) 
            plotcord[id,c(2,3)]})) 

colnames(dat.lines) <- paste(rep(c('x','y'),3),rep(1:3,each=2),sep='') 

Đây là cách nó trông dat.lines tôi:

 x1 y1 x2 y2 x3 y3 
1 1.750 2 1.50 3 2.00 3 
2 5.250 2 5.00 3 5.50 3 
3 1.375 1 1.00 2 1.75 2 
4 3.500 1 1.75 2 5.25 2 
5 6.000 1 1.75 2 5.25 2 
6 7.500 1 5.25 2 8.00 2 

Sau đó, tôi vẽ điểm bằng cách sử dụng mạng xyplot. Việc sử dụng mạng tinh thể thực sự thích hợp cho các ô như vậy. Không cần phải sacle dữ liệu (như gói lưới ví dụ). Sau đó, tôi tùy chỉnh bảng điều khiển thêm hình chữ nhật, phân đoạn, ...

library(latticeExtra)) 
xyplot(plotgridY~plotgridX,data= plotcord, 
     panel=function(x,y,...){ 
    apply(dat.lines,1,function(x){ 
     panel.segments(x0=x['x2'],y0=x['y2'],x1=x['x3'],y1=x['y3']) 
     boxh <- 0.5 
     x1=x['x1'] 
     y1=x['y1'] 
     y2 <- x['y2'] 
     x2 <- (x['x2']+x['x3'])/2 
     ydelta <- (y2 - y1)/2 
     browser() 
     panel.segments(c(x1, x1, x2), c(y1, y1 + ydelta, y2 - 
            ydelta), c(x1, x2, x2), c(y1 + ydelta, y2 - 
                   ydelta, y2)) 
    }) 

     panel.rect(x=x,y=y,width=unit(2,'cm'), 
        height=unit(2,'cm'),col='lightyellow') 
     panel.xyplot(x,y,...) 
     panel.text(x,y,adj=c(0,-3), 
        label=plotcord$plotname,cex=1.5) 

     ## add some prove of concept detail 
     panel.rect(x=x,y=y,width=unit(0.5,'cm'), 
        height=unit(0.5,'cm'),col='lightblue',lty=2) 
     panel.text(x,y,adj=c(1,2), 
        label=paste(plotcord$plotname,1,sep=''),cex=1,col='blue') 
     panel.text(x,y,adj=c(-0.5,2), 
        label=paste(plotcord$plotname,2,sep=''), 
        cex=1,col='blue') 


     },ylim=extendrange(plotcord$plotgridY,f=0.5),xlab='',ylab='', axis = axis.grid, 
    main='Arrangement of large number of plots \n and connect with lines ') 
+0

cảm ơn vì câu trả lời hay .... bây giờ nó là tốt hơn nhiều – jon

+1

@jon nó là tốt hơn để kiểm tra một câu trả lời. Nếu không, một nửa số tiền thưởng sẽ bị mất. – agstudy

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