1. 程式人生 > >R語言:如何在一張圖上畫多個填色等值線圖

R語言:如何在一張圖上畫多個填色等值線圖

  在R語言:填色等值線圖及其色標(color bar)設定中我們介紹了filled.contour函式的用法,它可以很方便的繪製帶色標的填色等值線圖。但是我們平時可能更多的需要將多個填色圖放在同一張圖上(如下圖所示),這種圖該如何繪製?


  相比R語言:填色等值線圖及其色標(color bar)設定介紹的圖形,這裡的難點主要有兩個,一是怎樣進行分面,二是怎樣在地圖上繪製陸地輪廓,下面我們將依次解決這兩個難題。

一、一頁多圖

  繪圖時進行分面操作常用的函式有par函式和layout函式,其中使用par函式分面主要通過調整mfrow引數實現,例如par(mfrow= c(2, 3))即是把當前繪圖區域等分為2行3列,其缺點是隻能對頁面進行等份,而我們繪圖的頁面佈局如下,顯然每個繪製區域並不相同,par(mfrow)方法並不適用。


  layout函式則可以處理這類問題,簡單介紹一下layout函式:

  layout(mat,
      widths =rep.int(1, ncol(mat)),
          heights = rep.int(1, nrow(mat)),
      respect = FALSE)

  其中引數mat是一個由整數1-N構成的矩陣,這裡假定我們要在同一個頁面上繪製N個圖形,數字1-N即是這N個圖形繪製的順序,而數字1-N在矩陣中的相對位置則表示影象在頁面上出現的相對位置。在這裡我們先繪製填色圖,然後繪製色標,最後繪製標題,頁面佈局矩陣如下:


  引數widths和heights是兩個向量分別表示矩陣中每一列的寬度和每一行的高度,這裡如果widths和heights給出的值是數字的話,則表示相對比例,如果是lcm函式的話則是以cm計量的絕對距離。在這裡我們的頁面佈局中,寬度是等分的,因此widths可以設定為c(12, 12, 12);在高度上標題和色標的高度要比主體的填色圖小一點,所以heights設定為c(2, 4, 4, 4, 4, 2)。

  引數respect如果為TRUE,表示繪圖的寬高比嚴格按照上面widths和heights給定的比例。

mat <-rbind(14, matrix(1:12, 4, 3), 13)
widths <-c(12, 12, 12)
heights <-c(2, 4, 4, 4, 4, 2)
layout(mat,widths = widths, heights = heights)
nf <-layout(mat, widths = widths, heights = heights)
layout.show(nf)

  上面的程式碼中,我們使用layout.show函式將頁面佈局畫出(如下圖所示),與我們之前設計的一樣。


  但是,即使是使用layout函式進行頁面劃分之後,使用filled.contour函式繪製填色等值線圖,依舊不會出現分面的效果,

mat<-rbind(14, matrix(1:12, 4, 3), 13)
widths <-c(12, 12, 12)
heights <-c(2, 4, 4, 4, 4, 2)
layout(mat,widths = widths, heights = heights)
filled.contour(x= x, y = y, z = z, levels = levels,
               las = 1,
               plot.title = title(main ="Jan", cex.main = 2),
               plot.axes = list(axis(1,seq(100, 160, by = 20), c('100E', NA, '140E', NA)),
                                axis(1, 180, 180),
                                axis(1,seq(200, 280, by = 20), c(NA, '140W', NA, '100W', NA)),
                                axis(2,seq(-20, 20, by = 10), c('20S', '10S', 'Eq', '10N', '20N'))),
               key.title = title(main ='degC'))


  這是因為filled.contour函式自身已經呼叫過一次layout函式,我們直接在R中輸入filled.contour,可以看到該函式的程式碼,原來filled.contour繪製的填色圖和色標的分面已經使用過layout函式。但是不要著急,我們繼續閱讀程式碼,可以發現其實filled.contour函式中繪製填色圖的部分使用了一個內建函式.filled.contour(x, y, z, levels, col),它只有4個引數,用法與filled.contour函式相同,我們可以使用.filled.contour繪製我們需要的圖形。


# 分面
mat<-rbind(14, matrix(1:12, 4, 3), 13)
widths <-c(12, 12, 12)
heights <-c(2, 4, 4, 4, 4, 2)
layout(mat,widths = widths, heights = heights)
# 頁面設定
mar <- c(2.5,4, 2, 1)
par(mar = mar,las = 1)
# 經緯度標籤
lon_num <-seq(120, 270, 30)
lat_num <-seq(-10, 10, 10)
lon_lab <-c("120E", "150E", "180",  "150W", "120W","90W")
lat_lab <-c("10S", "EQ", "10N")
# 繪填色圖
plot( xlim,ylim,
      xlim = range(xlim), ylim = range(ylim),
      xaxs = 'i', yaxs = 'i',
     xaxt = 'n', yaxt = 'n', type = 'n', ann=F)
 
.filled.contour(x,y, z, levels = levels, col = col)
# 繪陸地輪廓
map('world2Hires',xlim = range(x), ylim = range(y), add = T)
# 補齊邊框
axis(1, x,labels = NA, tcl = 0)
axis(3, x,labels = NA, tcl = 0)
axis(2, y,labels = NA, tcl = 0)
axis(4, y,labels = NA, tcl = 0)
# 經緯度標籤
axis(1, lon_num,lon_lab,
     mgp = c(4, 1.2, 0),
     cex.axis = 1.3)
axis(2, lat_num,lat_lab,
     mgp =c(4, 0.8, 0),
     cex.axis = 1.3)
# 月份標籤
axis(3, wz ,labels = 'Jan',
     mgp = c(3, 0.4, 0),
     tcl = 0,
     cex.axis = 1.6)


  成功啦!

  之後可以寫一個迴圈,將12個月的資料都繪製出來,最後繪製色標和標題,程式碼如下

# 色標
mar <- c(3,4, 1.5, 6)
unit <-expression(paste(''^'o','C', sep = ''))
nlev <-length(levels)
par(mar = mar,las = 1)
plot(x = 1:nlev,y = rep(1, nlev),
     xaxs = 'i', yaxs = 'i',
     xaxt = 'n', yaxt = 'n', type = 'n', ann =F)
rect(xleft =1:(nlev - 1),
     ybottom = rep(0, (nlev - 1)),
     xright = 2:nlev,
     ytop = rep(2, (nlev - 1)),
     col = col, border = 1)
par(new=T)
plot(x = 1:nlev,y = rep(1, nlev),
     xaxs = 'i', yaxs = 'i',
     xaxt = 'n', yaxt = 'n', type = 'n', ann =F)
axis(1, at =(2:(nlev - 1)),
     label = round(levels[2:(nlev - 1)],2),
     tcl = 0, cex.axis = 1.8)
axis(4, at = 1,
     label = unit,
     tcl = 0, cex.axis = 2)
 
# 標題
title <- 'TheDevelopment of SSTA in 1997'
size_t <- 3
par(mar = c(0,0, 0, 0),las = 1)
plot(c(0, 4),c(0, 4),
     xlim = c(0, 4), ylim = c(0, 4),
     xaxs = 'i', yaxs = 'i',
     xaxt = 'n', yaxt = 'n', type = 'n', ann =F, axes = F)
text(x = 2, y =2, labels = title, cex = 3)

二、繪製陸地輪廓

  陸地和國家的輪廓資訊我們可以呼叫maps包或者mapdata包,其中mapdata裡的地圖資訊更加豐富,我們這裡使用mapdata包的world2Hires資料集。首先我們將要使用的地圖資訊繪製出來

x <- seq(from= 98.5, to = 288.5, by = 1)
y <- seq(from= -20.5, to = 20.5, by = 1)
map('world2Hires',xlim = range(x), ylim = range(y))


  map函式中的add引數如果設定為TRUE,則會在現有的影象上疊加地圖,例如:

plot( range(x),range(y),
      xlim = range(x), ylim = range(y),
      xaxs = 'i', yaxs = 'i',
      xaxt = 'n', yaxt = 'n', type = 'n',ann=F)
map('world2Hires',xlim = range(x), ylim = range(y), add = T)


拓展閱讀:

相關推薦

R語言如何在等值線

  在R語言:填色等值線圖及其色標(color bar)設定中我們介紹了filled.contour函式的用法,它可以很方便的繪製帶色標的填色等值線圖。但是我們平時可能更多的需要將多個填色圖放在同一張圖上(如下圖所示),這種圖該如何繪製?   相比R語言:填色等值線圖及其

R語言——在兩組資料之twoord.plot

在plotrix包中有twoord.plot()很好用,可以在同一張圖上畫兩組不同的資料的圖。 比分屏對我來說好用多了。。。。。 在載入了plotrix包後就可以畫圖啦 不加選項是這樣子,是個折線圖: library(plotrix) T1<-da

使用pyplot在畫布繪製個子的python指令碼

#coding=utf8 import matplotlib.pyplot as plt import numpy as np #建立陣列:x、y1、y2、y3、x4、y4 x = np.array([10, 8, 13, 9, 11, 14, 6, 4, 12, 7,

如何使用Graphics2D在圖片線(包括箭頭)

有這樣一個需求,在一張圖片上畫幾條線並儲存,如圖所示: 已知各個點的x,y座標,座標範圍是[0.000,1],即將橫縱方向分成1000份。 我們可以使用java.awt.Graphics2D的庫來實現。 Graphics2D在Graphics類提供繪製各種基本的幾何圖形的基礎上進行

git學習筆記臺電腦配置兩git賬戶

idt ica 項目 auth 開源中國 重復 gmail name 微軟 如何在一臺電腦上配置兩個git賬戶,現在雲端倉庫很多,有開源中國的 gitee.com 微軟的 github.com 還有 gitlab.com 和 bitbucket.org 等等,下面是具體步驟

git 在臺機器配置賬戶

rac ssh xxxxxx pla 必須 account ack entity 設置 前提: 必須知道怎樣配置git賬戶,請參考git官方教程:https://help.github.com/articles/generating-ssh-keys 這個教程能教你怎

臺電腦配置tomcat

壓縮版 protocol proto 控制 catalina xml文件 prot red star 很多時候我們要配置多個tomcat 但是啟動時候就會好多錯誤和沖突 要麽startup的時候就把兩個tomcat全給起了。。。不好控制 下面給出解決方案 一臺電腦同

如何在臺電腦安裝jdk

tput support -c win index text different ref recent Technote (FAQ) Question How to install multiple versions of Java on a workstation? C

【轉】在臺伺服器配置Tomcat 教程

在一臺伺服器上配置多個Tomcat,主要就是要避免Tomcat伺服器的埠衝突的問題。 只需要修改CATALINA_HOME\conf\server.xml中的啟動埠和連線埠就好了! 下面我們把配置的詳細過程寫在下面,以供參考:(此例以配置三個Tomcat為例) 1. 下載apache-to

臺電腦部署tomcat並啟動專案

1.需求 原本的機器上已經有一臺tomcat了,為了不影響之前的專案,新部署一個,跑專案。 2.實現 1.將tomcat壓縮包複製到新建的資料夾c盤的aaa,解壓 2.將C:\aaa\apache-tomcat-7.0.85\webapps下的所有檔案刪除, 匯出的bbb.war放入C:

運維——在臺主機建立網站

假設有很多個網站,那麼如果每個網站都配一個伺服器的話顯然是很浪費的,其實一個伺服器是能放很多個網站,具體實現步驟如下: 1、建立目錄用來存放各個網站的資訊,路徑可以使用預設的也可以自己建立,此處使用預設的路徑 建立了三個目錄用來存放三個網站,如果想開啟IP就能開到內容則可以直接在/var/www/ht

臺電腦部署Tomcat案例

思路:如果要在一臺伺服器上配置多個Tomcat,主要就是要避免Tomcat伺服器的埠衝突的問題。 下面我們把配置的詳細過程寫在下面,以供參考:(此例以配置三個Tomcat為例) 1. 下載apache-tomcat-7.0.63,下載下來的檔案為apache-tomcat-7.0.63.zi

臺電腦配置tomcat,詳解

  在伺服器上配置了多個tomcat,每個tomcat下的專案都獨立執行。 我這邊是一臺機器上配置5個tomcat,一個簡單的搭建教程和大家分享! 1.拷貝出多個tomcat目錄,需要把tomcat的名稱改為不相同的。 2.環境變數配置。 我的電腦-》右鍵屬性-》高階

Git 學習筆記(1)管理臺電腦公鑰

1. 前提條件  安裝 Git。 2. 建立公鑰  開啟.ssh資料夾(位於:C:\Users\Administrator\.ssh),右鍵資料夾空白處,開啟 Git Bash(Git Bash h

臺機器搭建redis例項的配置檔案修改部分

1、單個redis服務搭建請參考:redis服務搭建 2、一臺Redis伺服器,分成多個節點,每個節點分配一個埠(6380,6381…),預設埠是6379。 每個節點對應一個Redis配置檔案,如: redis6380.conf、redis6381.conf #cp redis.conf

臺電腦配置eclipse

開啟eclipse的檔案文字 因為eclipse啟動的時候會讀虛擬機器如果找不到的會會找java_home所以放在在eclipse下放在jreeclipse就不在尋找java_home了

檢測圖片中的人臉、裁剪出所有的人臉區域並儲存裁剪後的人臉影象

我可愛的導師叫我去收集50個人臉正樣本和50個列印攻擊的人臉負樣本~ python程式碼 # 2018-01-24 # By TimeStamp # https://blog.csdn.net/weixin_40674835/article/details/79

[work] matplotlib 曲線的折線

這裡我利用的是matplotlib.pyplot.plot的工具來繪製折線圖,這裡先給出一個段程式碼和結果圖: # -*- coding: UTF-8 -*- import numpy as np import matplotlib as mpl import matplotlib.pypl

如何再臺電腦配置不同版本的tomcat同時執行

1、配置執行tomcat 首先要配置java的jdk環境,這個就不在寫了  不懂去網上查查,這裡主要介紹再jdk環境沒配置好的情況下 如何配置執行多個tomcat 2、第一個tomcat: 找到"我的電腦" 裡面的環境變數 , 新增"CATALINA_HOME"="E:\a

如何在臺電腦部署tomcat?

配置多個tomcat (下面所述方式是本人學習時查資料在自己本機配置方法總結,如果有哪裡不對希望大家留言指出,謝謝) 1. 第一個Tomcat部署: 解壓下載好的解壓版tomcat 配置環