[轉]ggplot2用法簡單介紹


簡介

ggplot2包是基於Wilkinson在《Grammar of Graphics》一書中所提出的圖形語法的具體實現, 這套圖形語法把繪圖過程歸納為data, transformation, scale, coordinates, elements, guides, display等一系列獨立的步驟, 通過將這些步驟搭配組合, 來實現個性化的統計繪圖。於是, 得益於該圖形語法, Hadley Wickham所開發的ggplot2是如此人性化, 不同於R基礎繪圖和先前的lattice那樣參數滿天飛, 而是擯棄了諸多繁瑣細節, 並以人的思維進行高質量作圖。在ggplot2包中, 加號的引入革命性的, 這個神奇的符號完成了一系列圖形語法疊加, 也是這個符號, 讓很多人喜歡上了用R來進行統計繪圖。

    ggplot2的作者Hadley Wickham絕對是R界的男神, 很多人都對Hadley的R包重度依賴, 例如他所開發的plyr、reshape2和ggplot2三款包, 完全可滿足日常的數據處理和可視化過程。所以, 當男神今年造訪北京R語言大會引起了不小的轟動。

    在論文繪圖哪家強這個問題上, 知乎上已有各種神回復。除卻一些稀奇古怪的繪圖難以達成, ggplot2以美輪美奐的統計制圖能力一定能排進各類繪圖軟件的前三。對ggplot2功能的擴展也在加強。例如plotly能夠支持以ggplot2為源碼的交互式繪圖, Hadley正在開發ggvis除了支持交互式繪圖, 已把管道作為ggvis的重要組成部分。可以預見的是統計繪圖將會變得更交互、更快速。

    本文既是自己對ggplot2學習的總結, 也希望能幫助大家對ggplot2快速入門。主要以Hadley的官方文檔為教材, 介紹了ggplot2的基本原理和操作, 鏈接了部分ggplot2參數索引, 並在最后加入了作圖實戰。

圖形語法

    盡管qplot作為ggplot2的快速作圖(quick plot)函數, 能夠極大的簡化作圖步驟, 容易入門和上手, 但是qplot卻不是泛型函數, 而ggplot()作為泛型函數, 能對任意類型的R對象進行可視化操作, 是ggplot2的精髓所在, 因而在本文中主要的繪圖都是通過ggplot()來完成的。有關於qplot的介紹可以細看Hadley的官方介紹

    在Hadley的ggplot2官方文檔中, Hadely這樣對Wilkinson的圖形語法進行了描述:“一張統計圖形就是從數據到幾何對象(geometric object, 縮寫為geom, 包括點、線、條形等)的圖形屬性(aesthetic attributes, 縮寫為aes, 包括顏色、形狀、大小等)的一個映射。此外, 圖形中還可能包含數據的統計變換(statistical transformation, 縮寫為stats), 最后繪制在某個特定的坐標系(coordinate system,  縮寫為coord)中, 而分面(facet, 指將繪圖窗口划分為若干個子窗口)則可以用來生成數據中不同子集的圖形。”因此在ggplot2中, 圖形語法中至少包括了如下幾個圖形部件:

  1. 數據(data)
  2. 映射(mapping)
  3. 幾何對象(geom)
  4. 統計變換(stats)
  5. 標度(scale)
  6. 坐標系(coord)
  7. 分面(facet)

    這些組件之間是通過“+”, 以圖層(layer)的方式來粘合構圖的, 所以圖層是ggplot2中一個重要的概念。當然, 在掌握基本的圖形部件基礎上, 要完成一幅高質量的統計繪圖, 仍然需要其他圖形部件來進一步擴展, 這包括了:

  1. 主題(theme)
  2. 存儲和輸出

    接下來將對這些在ggplot2包中出現的概念逐一展開

數據(data)

  1. 在ggplot2中, 所接受的數據集必須為數據框(data.frame)格式, 如內置的mtcars數據集:
  
head(mtcars)

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

 

  1. 這種格式帶來的好處是數據易於存儲, 也能在保留原有的繪圖參數下, 用%+%方便地變更已有數據集。

          為通過”+”以圖層的方式加入點的幾何對象 

      
p <- ggplot(mtcars, aes(x=mpg, y=wt, colour=cyl)) +geom_point() #geom_point()為通過”+”以圖層的方式加入點的幾何對象
p
mtcars.c <- transform(mtcars, mpg = mpg^2)
p %+% mtcars.c #用mtcars.c替換mtcars

 

  1. 而ggplot2進行數據分組時必須根據行, 而不能根據列, 例如在mtcars的數據集中, 可以把汽車按汽缸數進行分組, 但不能按汽車的檔位數和汽缸數這兩個變量分為兩組。這要求把“寬”數據轉化為“長”數據。所謂的長數據是變量不在是放在各個列上, 而是拍成一列, 每一個變量都分別占其中的幾行, 這樣就能方便的對每個變量進行分組。reshape2中melt()和cast()能夠靈活的融合(melt)重鑄(cast)在數據框中的數據。
      
#融合檔位數和汽缸數這兩個變量
mtcars.m <- melt(mtcars, id = c("mpg", "disp", "hp", "drat", "wt", "qsec", "vs", "carb")) 
head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1


head(mtcars.m)
   mpg disp  hp drat    wt  qsec vs carb variable value
1 21.0  160 110 3.90 2.620 16.46  0    4      cyl     6
2 21.0  160 110 3.90 2.875 17.02  0    4      cyl     6
3 22.8  108  93 3.85 2.320 18.61  1    1      cyl     4
4 21.4  258 110 3.08 3.215 19.44  1    1      cyl     6
5 18.7  360 175 3.15 3.440 17.02  0    2      cyl     8
6 18.1  225 105 2.76 3.460 20.22  1    1      cyl     6

 

映射(mapping)
(1) 映射的概念

    aes()函數是ggplot2中的映射函數, 所謂的映射即為數據集中的數據關聯到相應的圖形屬性過程中一種對應關系, 例如:

> p1 <- ggplot(data = mtcars)
> summary(p1)
data: mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb [32x11]
faceting: facet_null()
> p2 <- ggplot(data = mtcars, mapping = aes(x = wt, y = hp, color = gear))
> summary(p2)
data: mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb [32x11]
mapping:  x = wt, y = hp, colour = gear
faceting: facet_null()

 

可以發現, 在p2中, 通過aes()指定了橫縱坐標分別為wt和hp, 顏色為gear這三種圖形屬性, 在ggplot2中不同的幾何對象對應着不同的圖形屬性, 有關於幾何對象的將在下面的小節講解。
(2) 設定和映射
    映射是將一個變量中離散或連續的數據與一個圖形屬性中以不同的參數來相互關聯, 而設定能夠將這個變量中所有的數據統一為一個圖形屬性。

p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point(color = "blue") #設定散點的顏色為藍色
p + geom_point(aes( color = "blue"))

 


   

最后一行語句為錯誤的映射關系, 在aes中, color = “blue”的實際意思是把”blue”當為一個變量, 用這個變量里的數據去關聯圖形屬性中的參數, 因為”blue”只含有一個字符變量, 默認情況下為離散變量, 按默認的顏色標度標記為桃紅色

(3)分組(group)也是ggplot2種映射關系的一種, 默認情況下ggplot2把所有觀測點分為了一組, 如果需要把觀測點按額外的離散變量進行分組處理, 必須修改默認的分組設置。

p1 <- ggplot(data = mtcars, mapping = aes(x = wt, y = hp)) + geom_line()
#默認分組設置, 即group=1
#geom_line為折線圖的幾何對象
p2 <- ggplot(data = mtcars, mapping = aes(x = wt, y = hp, group = factor(gear))) + geom_line() 
#把wt和hp所對應的觀測點按gear(gear以因子化變為離散變量)進行分組

 


圖層(layer)
    在上文中通過對數據和映射的講解中, 我們已經采用過”+”來添加圖層, ggplot2中圖層的概念和PS中圖層的概念很像, 可以這樣理解ggplot2中的圖層:每個圖層可以代表一個圖形組件, 例如下面要介紹的幾何對象、統計變換等圖形組件, 這些組件以圖層的方式疊加在一起構成一個繪圖的整體, 在每個圖層中的圖形組件又可以分別設定數據、映射或其他相關參數, 因此組件之間又是具有相對獨立性的。ggplot2中圖層的設定是十分成功的, 因為這一過程是如此實用、方便而富有邏輯性。
(1) 在幾何對象中設定映射
前面我們已在ggplot()中設定了映射了關系, 這種映射關系是默認的, 我們可以在后面的幾何對象中沿用已設定的默認映射關系, 也可以隨時在幾何對象中進行更改。

p <- ggplot(mtcars, aes(x = mpg, y = wt, color = factor(gear)))
#設定默認的映射關系
p + geom_point()
#沿用默認的映射關系來繪制散點圖
p + geom_point(aes(shape = factor(carb)))
#添加圖層中的shape的映射關系
p + geom_point(aes(y = carb)))
#修改默認的y的映射關系, 注意圖中y軸名稱仍然以默認的wt表示
p + geom_point(aes(color = NULL))
 #刪除默認的color映射關系

 


盡管上面三個有關例子在實際應用中很少去涉及, 但是很好的說明了圖層、數據和映射之間的關系。
(2) 采用多個數據集或向量數據繪圖
在很多種繪圖場合中, 我們會運用到多個數據集或向量數據來進行圖層疊加, 具體的例子如下

1
2
3
4
5
6
7
8
#構建不同於mtcars的數據集mtcars.c
mtcars.c <- transform(mtcars, mpg = mpg^2)
ggplot()+
   geom_point(aes(x = hp, y = mpg), data = mtcars, color = "red" ) +
   geom_point(aes(x = mtcars $hp , y = mtcars $disp ), color = "green" )+
   #選用向量數據
   geom_point(aes(x = hp, y= mpg), data = mtcars.c, color = "blue" )
   #選用不同的數據集

幾何對象(geom)和統計變換(stat)
    幾何對象執行着圖層的實際渲染, 控制着生成的圖像類型。例如用geom_point()將會生成散點圖, 而geom_line會生成折線圖。統計變換即對數據進行統計變化, 通常以某種方式對數據信息進行匯總, 例如通過stat_smooth()添加光滑曲線。
每一個幾何對象都有一個默認的統計變換, 並且每一個統計變換都有一個默認的幾何對象。正因如此, 這一設定將會使繪圖過程變的靈活多變。
在ggplot2的官方索引中, 已對ggplot2中所有的geom和stat組件進行了匯總, 更詳細的內容, 可直接點開相應圖形組件所對應的鏈接。下面對幾個常用的幾何對象和統計變換進行舉例描述。
(1) geom_point()散點圖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
p < - ggplot(mtcars, aes(wt, mpg))
p + geom_point()
#更改顏色-連續變量
p + geom_point(aes(color = qsec))
#更改顏色-離散變量
p + geom_point(aes(color = factor(gear)))
#更改透明度
p + geom_point(aes(alpha = qsec))
#更改形狀
p + geom_point(aes(shape = factor(gear)))
#更改點大小
p + geom_point(aes(size = qsec))
#兩種顏色的疊加
p + geom_point(color = "grey50" , size = 5 ) + geom_point(aes(color = qsec), size = 4 )
#顏色和形狀的疊加
p + geom_point(color = "grey50" , size = 5 ) + geom_point(aes(shape = factor(gear)), size = 3 )


(2) geom_histogram()

1
2
3
4
5
6
7
m < - ggplot(movies, aes(rating))
#這里使用movies數據集
m + geom_histogram()
m + geom_histogram( bin = 0.5 )
#調整分箱(bin)數據
m + geom_histogram( bin = 1 )
m + geom_histogram( bin = 2 )


 

geom_histogram()這個幾何對象默認使用stat_bin這個統計變換, 而這個統計變換會生成(1)count:每個組里觀測值的數目, (2)density:每個組里觀測值的密度和(3)x:組的中心位置這三個變量。生成的變量在ggplot()中的再使用..圍起來, 因此可以用來生成如下的圖

1
2
m + geom_histogram(bin = 0.5, aes(fill =.. count ..))
m + geom_histogram(bin = 0.5, aes(y = ..density..)) + geom_density()


元素位置的調整共有5種包括了(1)dodge:並排方式; (2)fill:堆疊圖像元素, 並將高度標准化為1,(3)identity:不做任何調整; (4)jitter:給點增加擾動避免重合和(5)stack:堆疊圖像元素。 

1
2
3
4
5
d < - ggplot(diamonds, aes(x = clarity, fill = cut ))
d + geom_histogram(position = "dodge" )
d + geom_histogram(position = "fill" )
d + geom_histogram(position = "stack" )
ggplot(diamonds) + geom_point(aes(color, price / carat), position = "jitter" )

    jitter使某每一個點在x軸的方向上產生隨機的偏移, 從而減少了圖形重疊的問題, 另一種介紹重疊的方式是改變點的透明度, 將在實戰中的地圖討論。


很多情況下, 我們會采用固定的x軸和y軸值來進行作圖, 此時需要用stat = “identity” 來申明, 即表示不對數據進行統計變換

1
2
3
A < - c( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 )
B < - c( 2 , 10 , 11 , 5 , 6 , 1 , 10 , 20 )
ggplot() + geom_histogram(aes(x = A, y = B), stat = "identity" )


(3) geom_smooth()
    geom_smooth()用來給數據添加平滑曲線, 所能采用的方法包括了lm, glm, gam, loess, rlm等, 這些方法需要通過加載公式來實現。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
m < - ggplot(mtcars, aes(qsec, wt))
m + stat_smooth() + geom_point()
m + stat_smooth(se = FALSE) + geom_point()
  #取消默認的置信區間
m + stat_smooth(fill = "red" , size = 2 , alpha = 0.5 , color = "green" ) + geom_point()
#更改置信區間和線條顏色
m + stat_smooth(method = "lm" ) + geom_point()
#用一元一次線性方程擬合
m + stat_smooth(method = "lm" , formula = y ~ poly(x, 3 )) + geom_point()
#使用一元二次方程擬合
require(splines)
require(MASS)
m + stat_smooth(method = "lm" , formula = y ~ ns(x, 3 )) + geom_point()
# 加載splines和MASS包, 使用自由度為3的自然樣條來進行擬合
m < - ggplot(mtcars, aes(y = wt, x = mpg, group = factor(cyl)))
m + stat_smooth(method = lm, aes(color = factor(cyl), fill = factor(cyl))) + geom_point( aes(color = factor(cyl)))
#按cyl這個離散變量進行分組, 分別擬合數據


    得益於r包的豐富性, 我們可以采用極大似然或最小二乘法, 對多種現有的函數或自編函數來擬合曲線。例如, 在對劑量-效應曲線繪圖的實戰中, 采用drc包中的log-logistics四參數方程來擬合劑量-效應曲線。
    在這偏不長的博文中, 很難對ggplot2中所有幾何對象和統計變換一一詳盡, 更詳細的內容可以在ggplot2的官方索引找到。但是通過前一小節有關於圖層的講解, 我們已能很容易的通過這些組件整合出一些復雜的圖形, 而這些組件的原理也是相同的。

標度(scale)
    標度控制着數據到圖形屬性的映射, 更重要的一點是標度將我們的數據轉化為視覺上可以感知的東西, 如大小、顏色、位置和形狀。所以通過標度可以修改坐標軸和圖例的參數。


表1所示, 所有標度構建器(scale constructor)都擁有一套通用的命名方案。它們以scale_開頭, 接下來是圖形屬性的名稱(例如,  color_、shape_或x_)最后以標度的名稱結尾(例如gradient、hue或manual)。從表中可以發現, 標度是區分離散和連續變量的, 因此再對標度進行調整一定要注意區分。ggplot2中的標度可以粗略的分為4類:(1)位置標度:用於將連續型、離散型和日期-時間型變量映射到繪圖區域, 以及構造對應的坐標軸;(2)顏色標度:用於將連續型和離散型變量映射到顏色; (3)手動離散型標度:用於將離散型變量映射到我們選擇的符號大小、線條類型、形狀或顏色, 以及創建對應的圖例; 以及(4)同一型標度:用於直接將變量值繪制為圖形屬性, 而不去映射他們。
實際應用中修改標度最長用的有3個方面(1)修改圖例和(2)修改圖形屬性和(3)修改坐標軸, 介於內容的復雜性, 建議詳細的參考如下鏈接:
(1)索引中有關scale的內容:http://docs.ggplot2.org/current/index.html
(2)cookbook中有關圖例的修改: 
http://www.cookbook-r.com/Graphs/Legends_(ggplot2)/
(3)cookbook中有關坐標軸的修改:
http://www.cookbook-r.com/Graphs/Axes_(ggplot2)/
(4)ColorBrewers配色方案:
http://colorbrewer.org
在后面的實例中, 每一張完美的圖都需要對其標度進行細致的修改。

分面(facet)
即在一個頁面上自動擺放多幅圖形, 這一過程先將數據划分為多個子集, 然后將每個子集依次繪制到頁面的不同面板中。ggplot2提供兩種分面類型:網格型(facet_grid)封面型(facet_wrap)網格分面生成的是一個2維的面板網格, 面板的行與列通過變量來定義, 本質是2維的; 封裝分面則先生成一個1維的面板條塊, 然后再分裝到2維中, 本質是1維的。
在很多情況下, 我們可能需要繪制有兩個y軸的坐標系, 而在ggplot2中, 這種做法特別不提倡(stackover的討論), 可解決的方法要么是把變量歸一化, 要么便是采用分面方法

1
2
3
4
5
6
7
p < - ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + facet_grid(. ~ cyl) #以cyl為分類變量
p + facet_wrap( ~ cyl, nrow = 3 ) #wrap與grid的區別
p + facet_grid(cyl ~ .) #以cyl為分類變量
p + facet_wrap( ~ cyl, ncol = 3 ) #wrap與grid的區別
p + facet_grid(vs ~ am) #以vs和am為分類變量
p + facet_wrap(vs ~ am, ncol = 2 ) #wrap與grid 的區別

1
2
3
4
5
p < - p + geom_smooth(method = "lm" , se = F, aes(color = factor(cyl))) + geom_point(aes(color = factor(cyl)))
p + facet_grid(vs ~ am)
p + facet_grid(vs ~ am, margins = T) #使用margins來描述邊際圖
p + facet_grid( ~ cyl, scales = "free" )
p + facet_grid( ~ cyl, scales = "free_x" )

1
2
3
4
5
6
7
p < - ggplot(aes(cty, hwy), data = mpg) + geom_point()
p + facet_wrap( ~ cyl)
#調整scales的標度, 共有fixed, free, free_x和free_y四種變換
p + facet_wrap( ~ cyl, scales = "free" ) # 這里標度更改為free
p + facet_grid(. ~ cyl, scales = "free" , space = "free" )
#space設置為free時, 每列的寬度與該列的標度范圍成比例
##使用自由標度來替代<strong>雙坐標軸</strong>的實戰的一個例子中

主題(theme)
    主題系統控制着圖形中的非數據元素外觀, 它不會影響幾何對象和標度等數據元素。主題修改是一個對繪圖精雕細琢的過程, 主要對標題、坐標軸標簽、圖例標簽文字調整, 以及網格線、背景、軸須的顏色搭配。

1
2
3
p < - ggplot(movies,  aes(x = rating)) + geom_histogram( bin = 1 )
p + theme_bw() #白色背景
p + theme_grey() #默認淺灰色背景


    主題由控制圖形外觀的多個元素組成, 詳見官方索引

1
2
3
4
5
##element_text()修改標簽和標題
p < - p + labs(title = "histogram" )
p + theme(plot.title = element_text(size = 20 , color = "red" ,
                                     hjust = 0 , face = "bold" ,
                                     angle = 180 ))


    內置元素共有四個基礎類型:文本(text), 線條(line)、矩形(rectangle)、空白(blank), text與其他類型操作相類似, 具體的例子可參考索引, 此處用element_blank()來去除灰色背景。

1
p + theme(panel.background = element_blank()) #blank是去掉某種繪圖元素

輸出(ggsave)
    ggsave()是ggplot2種特有的輸出函數, 是一種極為方便的出圖方式

1
2
3
p < - ggplot(mtcars, aes(x = mpg, y = disp)) + geom_point()
ggsave( file = "mtcars_plot.png" , width = 5 , height = 6 , type = "cairo" , dpi = 600 )
#cairo為抗鋸齒包, ggplot默認輸出即為cairo處理

ggplot2支持eps矢量圖輸出, 其他可以支持的格式包括png, jpg, pdf等, 並通過ggsave可以方便的進行修改。

 

ggplot2作圖實戰

時間序列

數據下載

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#用excel導入數據, 格式為csv
ori.data < - read.csv( "lesson8.csv" , header = F)
#以矩陣的方式讀入數據, 按行排列, 每三列換一行
data < - matrix(as.matrix(ori.data), nrow(ori.data) / 3 , 3 , byrow = TRUE)
#關閉區域特定的時間編碼方式
Sys.setlocale( "LC_TIME" , "C" )
#用as.POSIXlt()讀入字符串數據並轉化為date數據, 賦值給date, 或as.Date()
date < - as.POSIXlt(data[, 1 ], tz = " ", " % a % b % d % H: % M: % S HKT % Y")
#對ip和pv所在的列轉化為數值型
IP < - as.numeric(data[, 2 ])
PV < - as.numeric(data[, 3 ])
head(data)
#恢復區域特地的時間編碼方式
Sys.setlocale( "LC_TIME" , "")
#用ggplot2繪圖
require(ggplot2)
#用reshape包中的melt函數分解數據
require(reshape2)
p.data < - data.frame(date, IP, PV)
meltdata < - melt(p.data, id = (c( "date" )))
#用對IP和PV做分頁處理, y軸刻度自由變化
graphic < - ggplot(data = meltdata, aes(x = date, y = value, color = variable)) + geom_line() + geom_point()
graphic < - graphic + facet_grid(variable ~ ., scales = "free_y" )
#美化, 添加標題, 坐標, 更改圖例
graphic< - graphic + labs(x = "日期" , y = "人次" , title = "某網站7月至10月IP/PV統計" ) +
   theme(plot.title = element_text(size = 20 , face = "bold" )) +
   scale_colour_discrete(name = " ",labels = c(" IP "," PV")) +
   theme(strip.text.y = element_text(angle = 0 ))

 

地圖
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
require(maps)
require(ggplot2)
#用直方圖看下pop整體的分布
#可以發現數據分布較變化較大, 所以對pop做log轉化
qplot(pop, data = us.cities, binwidth = 0000 , geom = "histogram" )
qplot(log(pop), data = us.cities, binwidth = 0.03 , geom = "histogram" )
 
#繪制背景地圖
USA.POP < - ggplot(us.cities, aes(x = long , y = lat)) + xlim( - 130 , - 65 ) + borders( "state" , size = 0.5 ) +
   geom_point(aes(size = log(pop), color = factor(capital), alpha = 1 / 50 )) +
   #對size標度的調整參考http://docs.ggplot2.org/0.9.3.1/scale_size.html
   scale_size( range = c( 0 , 7 ), name = "log(City population)" ) +
   #對離散型顏色變量的標度調整參考http://docs.ggplot2.org/0.9.3.1/scale_manual.html
   #對連續型顏色標量的標度調整參考http://docs.ggplot2.org/0.9.3.1/scale_brewer.html
   #和http://docs.ggplot2.org/0.9.3.1/scale_gradient2.html
   scale_color_manual(values = c( "black" , "red" ), labels = c( "state capital" , "city" )) +
   #調整圖例
   guides(color = guide_legend(title = NULL)) + scale_alpha(guide = FALSE) +
   #繪制標題和坐標軸
   labs(x = "longtitude" , y = "latitude" , title = "City Population in the United States" ) +
   theme(plot.title = element_text(size = 20 ))
   
#輸出圖像 並用cairo包進行抗鋸齒處理
ggsave(USA.POP, file = "USA_POP.png" , type = "cairo" , width = 10 , height = 6.75 )

    當然, 這只是簡單的地圖繪制方法,統計之都上也有很多大牛來用R繪制各種各樣精美的地圖(12)。


劑量-效應曲線

R中的drc包很容易對各種劑量-效應曲線進行繪圖, 此處采用較為常用的log-logistic四參數方程擬合了劑量-效應曲線。

數據下載

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ori.data < - read.csv( "D-R curve.csv" )
require(drc)
require(reshape2)
#把數據融合
melt.data < - melt(ori.data, id = c( "dose" ), value.name = "response" )[, - 2 ]
#用drc包中的log-logistic四參數方程進行擬合建模
model < - drm(response ~ dose, data = melt.data, fct = LL. 4 (names = c( "Slope" , "Lower Limit" , "Upper Limit" , "EC50" )))
#確定x軸范圍並構建數據集
min < - range (ori.data$dose)[ 1 ]
max < - range (ori.data$dose)[ 2 ]
line.data < - data.frame(d.predict = seq( min , max , length.out = 1000 ))
#用模型預測數據構建數據集
line.data$p.predict < - predict(model, newdata = line.data)
#構建繪圖數據, 能夠計算誤差棒
require(plyr)
p.data < - ddply(melt.data, .(dose), colwise(mean))
p.data$sd < - ddply(melt.data, .(dose), colwise(sd))[, 2 ]
 
require(ggplot2)
p < - ggplot() +
   geom_errorbar(data = p.data, width = 0.1 , size = 1 ,
                 aes(ymax = response + sd, ymin = response - sd, x = dose)) +
   geom_point(data = p.data, aes(x = dose, y = response),
              color = "red" , alpha = 0.5 , size = 5 ) +
   geom_line(data = line.data, aes(x = d.predict, y = p.predict),
               size = 1 , color = "blue" ) +
   #改變坐標軸間隔
   scale_x_log10(name = "Dose" ,
                 breaks = c( 0.05 , 0.1 , 0.5 , 1 , 5 , 10 , 50 , 100 )) +
   scale_y_continuous(name = "Response" ) +
   theme_bw()
#查看擬合模型參數
summary(model)

邪惡之圖

    繪圖參數來自知乎, 此處亦有3D版本贈送

1
2
3
4
5
6
7
8
9
##用ggplot2來畫函數
library(ggplot2)
#確定x軸區域
f < - ggplot(data.frame(x = c( 0.00001 , 1 )), aes(x, color = "pink" , size = 2 ))
test < - function(x) {( 1 / 36 ) * exp( - (( 36 * x - 36 / 2.71828182845905 )^ 4 )) - 3 * x * log10(x)}
f < - f + stat_function(fun = test) + theme(legend.position = "none" ) +
   #旋轉坐標軸
   coord_flip()
f

注:封面圖片來自facebook社交數據可視化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM