R - 生成一个2x2面板,其中包含从列表创建的四个图

时间:2015-05-19 04:06:05

标签: r list graphics plot

我有一个包含四个数据框的列表,用于在lapply函数中创建绘图。这些图是单独创建的,但是我想将它们组织成一个2x2面板,如下例所示:

enter image description here

这是我正在使用的代码:

# create letters for legend
leg <- LETTERS[1:15]

# run function
l_ply(alldat, function(dat) {
    # first plot - ref data and one model
    taylor.diagram(dat[,2], dat[,3], pch=leg[1], col='black', pcex=1, normalize=T)

    # add remaining models
    for (i in 3:dim(dat)[2]) {
      model.wanted <- dat[,i]
      taylor.diagram(dat$CRU, model.wanted, add=T, col='black', pch=leg[i-2], pcex=1, normalize=T)
      }

  # add legend
  legend(x='top',
  legend=names(dat)[3:length(names(dat))],
  pch=leg, pt.cex=1,ncol=2)

})

我应该怎么做才能实现这个目标?我应该将图表保存在不同的对象中并在填充函数之后组织它们吗?

以下是我的数据摘录:

require(plotrix)
require(plyr)

cloud <- structure(list(date = structure(c(0, 31, 59, 90, 120, 151), class = "Date"), 
    CRU = c(67.6552579213225, 64.8199295882443, 67.6882136843717, 
    64.4932343486913, 62.0941221490892, 59.9333537425379), CanESM2 = c(66.972917385659, 
    71.4248852462099, 65.1381412601471, 67.1597958635029, 62.9675122718923, 
    65.6251207369531), `GFDL-ESM2M` = c(62.5805390942166, 62.8894567998808, 
    60.5108804320452, 64.7156850235086, 61.0681295548824, 64.5205937542971
    ), `GISS-E2-H` = c(61.6562727435151, 63.6979377938432, 61.934720028102, 
    62.9147267351652, 62.9400740659167, 64.0185837954248), `GISS-E2-R-CC` = c(63.0442187081722, 
    60.0853062955399, 60.9436761706614, 60.8772572772824, 61.7701362701327, 
    59.043906825997), `GISS-E2-R` = c(59.6711430384541, 62.8334974371481, 
    63.0131761539749, 61.7294481121309, 62.2555191908942, 61.5088982333356
    ), `HadGEM2-AO` = c(54.154605609548, 53.5172215357719, 54.4719170376292, 
    50.5503675739528, 51.8468629765371, 56.0233048048772), `HadGEM2-CC` = c(55.2767160056209, 
    55.4545621321912, 48.5067733614208, 49.7513141190709, 52.4741278958181, 
    49.7424716037677), `IPSL-CM5A-MR` = c(66.7466522042235, 63.6054491778145, 
    61.935661862022, 61.245452060337, 58.9980974818949, 60.1933125803763
    ), `IPSL-CM5B-LR` = c(61.5338846590087, 65.7333456200048, 
    67.3005378140901, 61.2494067126826, 62.0015259754588, 65.9300494528375
    ), MIROC4h = c(56.6392694529316, 56.7074476707051, 51.0562354028364, 
    51.0794469888308, 52.1698227633231, 54.4719042536529), `MRI-CGCM3` = c(63.6631087715584, 
    61.2187020278953, 59.3379579304255, 56.2363349944667, 56.8857660830788, 
    55.78558572393), `NorESM1-M` = c(65.0169360325908, 62.0288071442766, 
    57.6896775396247, 54.8514090107477, 55.3626083968536, 54.2549283168748
    ), `bcc-csm1-1-m` = c(56.3135573432878, 53.4686209116205, 
    56.6030430885226, 55.732017360598, 51.6051707954295, 53.9728077055279
    ), `bcc-csm1-1` = c(58.3639905689753, 59.9757869293257, 59.9353082093579, 
    58.3831427846875, 58.2989891237962, 61.5507059627109), inmcm4 = c(70.8259646403441, 
    69.1040767391383, 64.5515271993269, 64.6499744101575, 67.712215046297, 
    67.1942041779122)), .Names = c("date", "CRU", "CanESM2", 
"GFDL-ESM2M", "GISS-E2-H", "GISS-E2-R-CC", "GISS-E2-R", "HadGEM2-AO", 
"HadGEM2-CC", "IPSL-CM5A-MR", "IPSL-CM5B-LR", "MIROC4h", "MRI-CGCM3", 
"NorESM1-M", "bcc-csm1-1-m", "bcc-csm1-1", "inmcm4"), row.names = 1441:1446, class = "data.frame")

rhum <- structure(list(date = structure(c(0, 31, 59, 90, 120, 151), class = "Date"), 
    CRU = c(73.071142795189, 72.116517171492, 75.4633207613727, 
    74.9045111133869, 74.5648160247136, 75.5390179521703), CanESM2 = c(82.1738954084519, 
    84.2968531301844, 83.2241528402853, 82.4713266361527, 81.9882784900331, 
    82.2132649960434), `GFDL-ESM2M` = c(76.1144124999242, 75.513665275741, 
    73.7942696812278, 76.1981389223065, 77.0376873674448, 77.2976291681033
    ), `GISS-E2-H` = c(73.1633360881694, 73.7535375028465, 73.723200571049, 
    72.6744510703059, 72.5031851158365, 72.5837847137451), `GISS-E2-R-CC` = c(71.1623239923221, 
    71.5630121183116, 71.9035651911908, 71.8883493576273, 72.1201485964011, 
    71.100014834153), `GISS-E2-R` = c(72.9110190015648, 73.3857936309234, 
    72.300836242765, 73.3048428362573, 72.5734859763251, 73.6193392333092
    ), `HadGEM2-AO` = c(71.7564950985936, 72.6083887837505, 72.7375342461659, 
    72.740344318256, 71.66267194681, 73.9705993920042), `HadGEM2-CC` = c(71.7338096720155, 
    73.4017465092843, 72.2130968345954, 69.8187574099937, 71.6096575044331, 
    70.2428292344746), `IPSL-CM5A-MR` = c(78.288059507225, 77.7982102562531, 
    77.9391756146972, 77.3570118881806, 76.9254102912144, 78.1113354206643
    ), `IPSL-CM5B-LR` = c(75.3990921536942, 77.3814960362618, 
    77.868640870546, 75.6332361338431, 75.5473474519295, 76.3470846818623
    ), MIROC4h = c(79.4069241143388, 80.0844909618891, 79.6346667043229, 
    79.0549592401828, 78.8346751581159, 81.0161486809714), `MRI-CGCM3` = c(81.8501322783085, 
    81.2568695034897, 80.4855355377643, 78.7182931088007, 78.8133439352917, 
    79.2912475172121), `NorESM1-M` = c(78.3120701427348, 77.4754017090379, 
    78.7131021740562, 78.1530052865458, 77.5852423941183, 78.1157005267673
    ), `bcc-csm1-1-m` = c(70.2950344625551, 69.4160485183984, 
    71.8456119878669, 70.8761688262538, 69.9851922515958, 70.2416348498607
    ), `bcc-csm1-1` = c(70.8614835346512, 70.4910287544741, 71.8480513221339, 
    70.8844927347194, 68.8084697254917, 71.9636850577907), inmcm4 = c(78.5251270969012, 
    78.1160855633474, 77.6402386801424, 78.1458952445315, 80.520200454645, 
    81.1088210504097)), .Names = c("date", "CRU", "CanESM2", 
"GFDL-ESM2M", "GISS-E2-H", "GISS-E2-R-CC", "GISS-E2-R", "HadGEM2-AO", 
"HadGEM2-CC", "IPSL-CM5A-MR", "IPSL-CM5B-LR", "MIROC4h", "MRI-CGCM3", 
"NorESM1-M", "bcc-csm1-1-m", "bcc-csm1-1", "inmcm4"), row.names = 1441:1446, class = "data.frame")

prec <- structure(list(date = structure(c(0, 31, 59, 90, 120, 151), class = "Date"), 
    CRU = c(5.49765705623559, 4.77359806046721, 5.62158322758403, 
    4.67963243680965, 4.2224734968374, 3.36206455563072), CanESM2 = c(4.79841013514418e-05, 
    5.37084366300876e-05, 4.72436063370894e-05, 5.07240040760987e-05, 
    4.37060840171321e-05, 4.41549152620003e-05), `GFDL-ESM2M` = c(6.3110190671931e-05, 
    5.65601672228163e-05, 5.67905323120218e-05, 5.58747174119601e-05, 
    5.10299194571122e-05, 5.14087758533192e-05), `GISS-E2-H` = c(4.40334130183662e-05, 
    5.78179278927125e-05, 5.76373298150557e-05, 5.13821649194105e-05, 
    5.06616003234137e-05, 4.60405440060584e-05), `GISS-E2-R-CC` = c(4.61461863558762e-05, 
    4.68618486326754e-05, 4.74821135265079e-05, 4.96532111588744e-05, 
    4.66607892112438e-05, 4.53600483364368e-05), `GISS-E2-R` = c(4.2961224350566e-05, 
    4.73954128346998e-05, 4.55096010495126e-05, 4.86006751348426e-05, 
    4.62571152892935e-05, 4.80067136455394e-05), `HadGEM2-AO` = c(4.50663401267986e-05, 
    4.40587125943942e-05, 5.41502610411833e-05, 4.86846159373331e-05, 
    4.85895249255265e-05, 4.72307926738793e-05), `HadGEM2-CC` = c(4.95938421491449e-05, 
    5.13035752101009e-05, 3.91581380304816e-05, 4.72639322614053e-05, 
    4.97923195981998e-05, 4.55380785145821e-05), `IPSL-CM5A-MR` = c(4.53951482623454e-05, 
    4.92054317849646e-05, 4.50621633685784e-05, 4.64624592856241e-05, 
    4.61646753878609e-05, 4.31003875327151e-05), `IPSL-CM5B-LR` = c(4.17308168575824e-05, 
    5.44154765751375e-05, 6.03962372881687e-05, 4.75167315044657e-05, 
    4.53351027522876e-05, 4.82428198335856e-05), MIROC4h = c(5.41267226016149e-05, 
    5.48366948503037e-05, 3.91468390362469e-05, 4.19957443512316e-05, 
    4.23787540871146e-05, 4.59629308941648e-05), `MRI-CGCM3` = c(5.67073841622448e-05, 
    6.00310012922815e-05, 5.07071712055857e-05, 4.64848152199045e-05, 
    4.70707970739826e-05, 4.64690827108151e-05), `NorESM1-M` = c(5.75674811670015e-05, 
    4.47625188467447e-05, 4.30881349345795e-05, 4.36944636932066e-05, 
    3.76844750636054e-05, 4.15962233582706e-05), `bcc-csm1-1-m` = c(4.39661514721367e-05, 
    3.6267821524052e-05, 4.96688538581108e-05, 4.90777169791919e-05, 
    4.50199953206488e-05, 5.09378733154497e-05), `bcc-csm1-1` = c(4.36386251524885e-05, 
    4.26126923570228e-05, 4.66884100523015e-05, 4.91951448592167e-05, 
    4.72643404938543e-05, 4.92076636119263e-05), inmcm4 = c(4.7871848561418e-05, 
    4.65707714989636e-05, 4.22968050234147e-05, 4.66198387367896e-05, 
    4.72156627251913e-05, 4.97391754662504e-05)), .Names = c("date", 
"CRU", "CanESM2", "GFDL-ESM2M", "GISS-E2-H", "GISS-E2-R-CC", 
"GISS-E2-R", "HadGEM2-AO", "HadGEM2-CC", "IPSL-CM5A-MR", "IPSL-CM5B-LR", 
"MIROC4h", "MRI-CGCM3", "NorESM1-M", "bcc-csm1-1-m", "bcc-csm1-1", 
"inmcm4"), row.names = 1441:1446, class = "data.frame")

temp <- structure(list(date = structure(c(0, 31, 59, 90, 120, 151), class = "Date"), 
    CRU = c(296.434223174652, 296.551152609827, 295.79685902342, 
    295.167607530997, 293.372857798867, 292.000823511404), CanESM2 = c(294.090026903654, 
    294.048913615266, 293.927266376339, 292.923982638532, 291.957568370083, 
    290.557879524454), `GFDL-ESM2M` = c(294.587617285656, 295.170026368258, 
    294.699185428731, 293.39897071883, 291.958153620491, 290.823281496282
    ), `GISS-E2-H` = c(296.045575347365, 295.993069888109, 295.901643246656, 
    294.701849734658, 292.999441203513, 291.91942751522), `GISS-E2-R-CC` = c(295.225379535162, 
    295.585000105295, 295.330113525391, 294.238700231362, 292.708886065567, 
    291.756369528966), `GISS-E2-R` = c(294.794358359889, 295.510733017949, 
    295.185885248909, 294.214823331777, 292.880296472025, 291.535325179965
    ), `HadGEM2-AO` = c(294.945626152886, 295.335533520436, 294.719626134683, 
    294.040903554102, 292.615202968664, 291.228220812703), `HadGEM2-CC` = c(294.22197507981, 
    294.441414809199, 294.401702411495, 293.49032785516, 292.14932653059, 
    290.87190355089), `IPSL-CM5A-MR` = c(293.578417786715, 293.78668991892, 
    293.352080970452, 292.406195291441, 290.799876584059, 289.835797813371
    ), `IPSL-CM5B-LR` = c(294.73205410606, 295.119550463582, 
    294.817129682574, 293.711843713236, 292.056669504266, 290.864620461269
    ), MIROC4h = c(294.70635495013, 294.670434784471, 294.147371413917, 
    293.527049790767, 292.226820807206, 291.332287333528), `MRI-CGCM3` = c(294.933276968616, 
    294.879510125054, 294.846681027775, 293.857122733133, 292.572892091985, 
    290.789874549553), `NorESM1-M` = c(293.444156356722, 293.137026285093, 
    293.051839199847, 292.416654266893, 291.405479215209, 290.793948976394
    ), `bcc-csm1-1-m` = c(295.051305850737, 295.442825940227, 
    295.005397121139, 294.329125025342, 293.283857271964, 292.067603042335
    ), `bcc-csm1-1` = c(294.754791763038, 295.030755277935, 294.58344368204, 
    293.739068664194, 292.679743609512, 291.334636694479), inmcm4 = c(293.541987832945, 
    293.698833764506, 293.124162988495, 292.419409972074, 290.939433379592, 
    290.38564940157)), .Names = c("date", "CRU", "CanESM2", "GFDL-ESM2M", 
"GISS-E2-H", "GISS-E2-R-CC", "GISS-E2-R", "HadGEM2-AO", "HadGEM2-CC", 
"IPSL-CM5A-MR", "IPSL-CM5B-LR", "MIROC4h", "MRI-CGCM3", "NorESM1-M", 
"bcc-csm1-1-m", "bcc-csm1-1", "inmcm4"), row.names = 1441:1446, class = "data.frame")

# create list with data frames
alldat <- list(cloud, prec, rhum, temp)

1 个答案:

答案 0 :(得分:2)

使用基本图形进行多重绘图有多种机制。 ggplot2lattice有不同的方法;如果你这样倾斜,别人就需要帮助。

par(mfrow)

您可以使用(例如)par(mfrow=c(2,2))设置偶数网格图,以设置2x2网格图,首先绘制行。您也可以使用par(mfcol=c(2,2)),区别在于首先填充列。无论如何,你运行这个命令一次,然后用四个地块运行上面的l_ply,它只是去了城镇。

好处是使用它是微不足道的。缺点是所有图表都是相同的大小。例如,如上所述将其映射到您的密钥是不可行的。例如,您可以随时设置每网格边距,但其他一些内容则不太灵活。

layout()

这是一个很好的选择,虽然它需要更多的设置。它允许你做的最大的事情之一是不同的宽度/高度以及多列/行跨度。你上面的关键并不困难。我可能会设置类似的东西:

mtx <- matrix(c(1, 2, 5,
                3, 4, 5), byrow=TRUE, nrow=2)
layout(mtx, heights=c(1,1), widths=c(3,3,2))
## optional, will need to re-run layout() and not do this for actual plots
layout.show(n=6)

数字是图的顺序,所以你可以看到你的第五个(五个)图是两个单元格高。您可以使用值为0的空(忽略)单元格。所有必须为0或更大的整数,没有NA s,没有跳过的数字。

在您的示例中,您将在l_ply之前运行此代码,在此之后,您还需要再创建一个图表来组合您的密钥。

设置比par(mfrow)多一点,这是一个很好的工具。我喜欢的一个巨大好处是我可以拥有上面的图例/键,毫无疑问我的图像将具有相同的尺寸(其中一个替代方法是使用par(mar),直到你在图形区域之外有足够的空间)。

par(fig)

这实际上可以让你重叠情节。这可能非常令人困惑。我会留下它作为一个提及,并鼓励你做研究,如果你认为你想得到疯狂与情节。不,真的,这很有趣,但可能非常令人困惑。