1 安裝
# 獲取ggplot2 最容易的就是下載整個tidyverse:
install.packages("tidyverse")
# 也可以選擇只下載ggplot2:
install.packages("ggplot2")
# 或者下載GitHub上的開發者版本
# install.packages("devtools")
devtools::install_github("tidyverse/ggplot2")
2 快速入門
1 基本設置
library(ggplot2) ggplot(diamonds) #以diamonds數據集為例 #gg <- ggplot(df, aes(x=xcol, y=ycol)) 其中df只能是數據框 ggplot(diamonds, aes(x=carat)) # 如果只有X-axis值 Y-axis can be specified in respective geoms. ggplot(diamonds, aes(x=carat, y=price)) # if both X and Y axes are fixed for all layers. ggplot(diamonds, aes(x=carat, color=cut)) # 'cut' 變量每種類型單獨一個顏色, once a geom is added. #aes代表美化格式 ggplot2 把 X 和 Y 軸也當作和顏色、尺寸、形狀等相同的格式 設定顏色(不是基於數據框中的變量),需要在aes()外面設置 ggplot(diamonds, aes(x=carat), color="steelblue")
2 層
ggplot2 中的層也叫做 ‘geoms’.一旦完成基本設置,就可以再上面添加不同的層 此documentation 中提供所有的層的信息,增加層后,圖形才會展示出來。
library(ggplot2) gg <- ggplot(diamonds, aes(x=carat, y=price)) gg + geom_point()

gg + geom_point(size=1, shape=1, color="steelblue", stroke=2) # 'stroke' 控制點邊界的寬度 靜態設置格式

gg + geom_point(aes(size=carat, shape=cut, color=color, stroke=carat)) # carat, cut color 動態根據數據框中變量設置格式

ggplot(diamonds, aes(x=carat, y=price, color=cut)) + geom_point() + geom_smooth() # Adding scatterplot geom (layer1) and smoothing geom (layer2).
#或者是在geom層里面自定義美化格式ggplot(diamonds) + geom_point(aes(x=carat, y=price, color=cut)) + geom_smooth(aes(x=carat, y=price, color=cut))

#把不同平滑曲線整合成一條
library(ggplot2) ggplot(diamonds) + geom_point(aes(x=carat, y=price, color=cut)) + geom_smooth(aes(x=carat, y=price)) # Remove color from geom_smooth ggplot(diamonds, aes(x=carat, y=price)) + geom_point(aes(color=cut)) + geom_smooth() # same but simpler

# 把不同顏色的散點的形狀設成不同的 ggplot(diamonds, aes(x=carat, y=price, color=cut, shape=color)) + geom_point()
添加水平或者垂直線
p1 <- gg3 + geom_hline(yintercept=5000, size=2, linetype="dotted", color="blue") # linetypes: solid, dashed, dotted, dotdash, longdash and twodash p2 <- gg3 + geom_vline(xintercept=4, size=2, color="firebrick")#添加垂直線 p3 <- gg3 + geom_segment(aes(x=4, y=5000, xend=4, yend=10000, size=2, lineend="round"))#添加方塊 p4 <- gg3 + geom_segment(aes(x=carat, y=price, xend=carat, yend=price-500, color=color), size=2) + coord_cartesian(xlim=c(3, 5)) # x, y: start points. xend, yend: end points gridExtra::grid.arrange(p1,p2,p3,p4, ncol=2)

3 標簽
使用 labs 層來自定義標簽
library(ggplot2) gg <- ggplot(diamonds, aes(x=carat, y=price, color=cut)) + geom_point() + labs(title="Scatterplot", x="Carat", y="Price") # 增加坐標軸和圖像標題 print(gg)#保存圖形

4 主題和格式調整
使用Theme函數控制標簽的尺寸、顏色等,在element_text()函數內自定義具體的格式,想要清除格式,則設為element_blank()即可
gg1 <- gg + theme(plot.title=element_text(size=30, face="bold"),
axis.text.x=element_text(size=15), #x軸文本
axis.text.y=element_text(size=15),
axis.title.x=element_text(size=25),
axis.title.y=element_text(size=25)) +
scale_color_discrete(name="Cut of diamonds") # add title and axis text, 改變圖例標題
#scale_shape_discrete(name="legend title") 基於離散分類變量生成對應圖例標題
#scale_shape_continuous(name="legend title") 基於連續變量 shape fill color屬性
print(gg1)

#改變圖形中所有文本的顏色等 gg2 + theme(text=element_text(color="blue")) # all text turns blue.
#改變點的顏色
gg3 + scale_colour_manual(name='Legend', values=c('D'='grey', 'E'='red', 'F'='blue', 'G'='yellow', 'H'='black', 'I'='green', 'J'='firebrick'))

顏色表:

調整x y軸范圍
三種方法:
- Using coord_cartesian(xlim=c(x1,x2))
- Using xlim(c(x1,x2))
- Using scale_x_continuous(limits=c(x1,x2)) 注意:第2、3種方法會刪除數據框中不在范圍之內的點的信息
#調整x y 軸范圍
gg3 + coord_cartesian(xlim=c(0,3), ylim=c(0, 5000)) + geom_smooth() # zoom in

#刪除坐標范圍之外的點 注意這時候平滑線也會相應改變 可能會誤導分析 gg3 + scale_x_continuous(limits=c(0,3)) + scale_y_continuous(limits=c(0, 5000)) + geom_smooth() # deletes the points outside limits #> Warning message: #> Removed 14714 rows containing missing values (geom_point).

#改變x y軸標簽 間隔等
gg3 + scale_x_continuous(labels=c("zero", "one", "two", "three", "four", "five")) + scale_y_continuous(breaks=seq(0, 20000, 4000)) # Y 是連續變量 X 是類型變量

#旋轉文本角度 gg3 + theme(axis.text.x=element_text(angle=45), axis.text.y=element_text(angle=45))
gg3 + coord_flip() #把x和y軸對換
#設置圖形內背景網格 gg3 + theme(panel.background = element_rect(fill = 'springgreen'), panel.grid.major = element_line(colour = "firebrick", size=3), panel.grid.minor = element_line(colour = "blue", size=1))
圖形背景與邊距

#設置圖形外背景顏色和邊距 gg3 + theme(plot.background=element_rect(fill="yellowgreen"), plot.margin = unit(c(2, 4, 1, 3), "cm")) # top, right, bottom, left

圖例
gg3 + scale_color_discrete(name="") # 刪除圖例標題
p1 <- gg3 + theme(legend.title=element_blank()) # 刪除圖例標題
p2 <- gg3 + scale_color_discrete(name="Diamonds") # 改變圖例標題
gg3 + scale_colour_manual(name='Legend', values=c('D'='grey', 'E'='red', 'F'='blue', 'G'='yellow', 'H'='black', 'I'='green', 'J'='firebrick'))# 改變圖例標題和點顏色
#隱藏圖例標題
gg3 + theme(legend.position="none") # hides the legend
#改變圖例位置
p1 <- gg3 + theme(legend.position="top") # top / bottom / left / right 圖形外
#圖形內
p2 <- gg3 + theme(legend.justification=c(1,0), legend.position=c(1,0)) # legend justification 是圖例的定標點 把圖例的左下點作為 (0,0)
gridExtra::grid.arrange(p1, p2, ncol=2)
#相當於library(gridExtra)
#grid.arrange(p1, p2, ncol=2)
#改變圖例具體項目的順序 按照需求在圖例中創建一個新的類型變量
df$newLegendColumn <- factor(df$legendcolumn, levels=c(new_order_of_legend_items), ordered = TRUE)
#legend.title - 圖例標題
#legend.text - 圖例文本
#legend.key - 圖例背景框
#guides - 圖例符號
gg3 + theme(legend.title = element_text(size=20, color = "firebrick"), legend.text = element_text(size=15), legend.key=element_rect(fill='steelblue')) + guides(colour = guide_legend(override.aes = list(size=2, shape=4, stroke=2)))
# legend title color and size, box color, symbol color, size and shape.


5 多圖繪制
gg1 + facet_wrap( ~ cut, ncol=3) # cut類型變量的每種類型是一個圖 設置為三列 gg1 + facet_wrap(color ~ cut) # row: color, column: cut 左邊的對應行 右邊的對應列 gg1 + facet_wrap(color ~ cut, scales="free") # row: color, column: cut 釋放尺度限制 gg1 + facet_grid(color ~ cut) # 為方便比較 把所有圖片放在網格中 頭信息去掉 更多的空間給圖形

6 一些經常用到的特征
制作時間序列圖形(使用ggfortify)
使用ggfortify包很容易直接用一個時間序列對象來畫時間序列圖形,而不用把數據類型轉換為數據框,更多請見
#下載ggfortify包
library(devtools)
install_github('sinhrks/ggfortify')
ggfortify 使得 ggplot2 知道怎么解譯 ts 對象. 加載 ggfortify 包后, 你可以使用 ggplot2::autoplot 函數來操作 ts 對象
library(ggfortify) autoplot(AirPassengers) + labs(title="AirPassengers") # where AirPassengers is a 'ts' object

autoplot(AirPassengers, ts.colour = 'red', ts.linetype = 'dashed')#改變線的顏色和類型 #使用 help(autoplot.ts) (or help(autoplot.*) for any other objects) 來查詢可以改變的選項

autoplot 也能處理其他時間序列類型. 支持的包有:
zoo::zooregxts::xtstimeSeries::timSeriestseries::irts
library(xts) autoplot(as.xts(AirPassengers), ts.colour = 'green')

也能通過命名改變{ggplot2} 幾何圖形類型. 支持線、條形、點圖
autoplot(AirPassengers, ts.geom = 'bar', fill = 'blue') autoplot(AirPassengers, ts.geom = 'point', shape = 3)

同一張圖上畫多個時間序列
要求數據是數據框類型,且一列必須為時間數據
(1)轉換成數據框后,累加層
# Approach 1: data(economics, package="ggplot2") # 數據初始化 economics <- data.frame(economics) # 轉換為數據框類型 ggplot(economics) + geom_line(aes(x=date, y=pce, col="pcs")) + geom_line(aes(x=date, y=unemploy, col="unemploy")) + scale_color_discrete(name="Legend") + labs(title="Economics") # 畫多條線 使用 'geom_line's
(2)使用 reshape2::melt 設置 id 到日期格式來合並數據框. 然后增加一個 geom_line 把顏色格式設置為variable (此變量是在合並過程中被創建).
# Approach 2:
library(reshape2)
df <- melt(economics[, c("date", "pce", "unemploy")], id="date")
ggplot(df) + geom_line(aes(x=date, y=value, color=variable)) + labs(title="Economics")# plot multiple time series by melting

條形圖
ggplot 默認創建的是 ‘counts’ 型的條形圖,即計算某一列變量中每種值出現的頻數,這時候無需指定y軸的變量
但是呢,如果想具體指定y軸的值,這時候一定要在geom_bar內設置stat="identity"
# 絕對條形圖: Specify both X adn Y axis. Set stat="identity"
df <- aggregate(mtcars$mpg, by=list(mtcars$cyl), FUN=mean) # 計算每個'cyl'對應的mpg變量均值
names(df) <- c("cyl", "mpg")#為數據框增加變量名字
head(df)
#> cyl mpg
#> 1 4 26.66
#> 2 6 19.74
#> 3 8 15.10
gg_bar <- ggplot(df, aes(x=cyl, y=mpg)) + geom_bar(stat = "identity") # Y axis is explicit. 'stat=identity'
print(gg_bar)

改變條形圖的顏色和寬度
df$cyl <- as.factor(df$cyl)#把cyl作為類型變量 gg_bar <- ggplot(df, aes(x=cyl, y=mpg)) + geom_bar(stat = "identity", aes(fill=cyl), width = 0.25) gg_bar + scale_fill_manual(values=c("4"="steelblue", "6"="firebrick", "8"="darkgreen"))

改變顏色
library(RColorBrewer) display.brewer.all(n=20, exact.n=FALSE) # 展示所有顏色方案 ggplot(mtcars, aes(x=cyl, y=carb, fill=factor(cyl))) + geom_bar(stat="identity") + scale_fill_brewer(palette="Reds") # "Reds" is palette name

gg <- ggplot(mtcars, aes(x=cyl)) p1 <- gg + geom_bar(position="dodge", aes(fill=factor(vs))) # side-by-side 並列 p2 <- gg + geom_bar(aes(fill=factor(vs))) # stacked 堆積 gridExtra::grid.arrange(p1, p2, ncol=2)

折線圖
# 方法 1: gg <- ggplot(economics, aes(x=date)) # 基本設置 gg + geom_line(aes(y=psavert), size=2, color="firebrick") + geom_line(aes(y=uempmed), size=1, color="steelblue", linetype="twodash") #沒有圖例 # 折線類型有: solid, dashed, dotted, dotdash, longdash and twodash

# 方法 2:
library(reshape2)
df_melt <- melt(economics[, c("date", "psavert", "uempmed")], id="date") # melt by date.
gg <- ggplot(df_melt, aes(x=date)) # setup
gg + geom_line(aes(y=value, color=variable), size=1) + scale_color_discrete(name="Legend") # gets legend.有圖例

絲帶圖
使用 geom_ribbon()畫填充時間序列圖 需要 ymin and ymax 兩個參量
# Prepare the dataframe
st_year <- start(AirPassengers)[1] #開始年份
st_month <- "01"
st_date <- as.Date(paste(st_year, st_month, "01", sep="-"))#開始日期
dates <- seq.Date(st_date, length=length(AirPassengers), by="month")#生產日期數組 以月為間隔
df <- data.frame(dates, AirPassengers, AirPassengers/2)#一定要記得構建數據框
head(df)
#> dates AirPassengers AirPassengers.2
#> 1 1949-01-01 112 56.0
#> 2 1949-02-01 118 59.0
#> 3 1949-03-01 132 66.0
#> 4 1949-04-01 129 64.5
#> 5 1949-05-01 121 60.5
#> 6 1949-06-01 135 67.5
# Plot ribbon with ymin=0
gg <- ggplot(df, aes(x=dates)) + labs(title="AirPassengers") + theme(plot.title=element_text(size=30), axis.title.x=element_text(size=20), axis.text.x=element_text(size=15))
gg + geom_ribbon(aes(ymin=0, ymax=AirPassengers)) + geom_ribbon(aes(ymin=0, ymax=AirPassengers.2), fill="green")

gg + geom_ribbon(aes(ymin=AirPassengers-20, ymax=AirPassengers+20)) + geom_ribbon(aes(ymin=AirPassengers.2-20, ymax=AirPassengers.2+20), fill="green")

區域圖
geom_area和 geom_ribbon類似,只是 ymin設置為 0,如果想畫重疊的區域圖,使用 alpha aesthetic 使得最外層為透明的
# Method1: 非重疊區域
df <- reshape2::melt(economics[, c("date", "psavert", "uempmed")], id="date")
head(df, 3)
#> date variable value
#> 1 1967-07-01 psavert 12.5
#> 2 1967-08-01 psavert 12.5
#> 3 1967-09-01 psavert 11.7
p1 <- ggplot(df, aes(x=date)) + geom_area(aes(y=value, fill=variable)) + labs(title="Non-Overlapping - psavert and uempmed")
# Method2: 重疊區域 PS:因為沒有構建成數據框,也就相應沒有圖例啦
p2 <- ggplot(economics, aes(x=date)) + geom_area(aes(y=psavert), fill="yellowgreen", color="yellowgreen") + geom_area(aes(y=uempmed), fill="dodgerblue", alpha=0.7, linetype="dotted") + labs(title="Overlapping - psavert and uempmed")
gridExtra::grid.arrange(p1, p2, ncol=2)

箱形圖和小提琴圖
可以使用: * outlier.shape * outlier.stroke * outlier.size * outlier.colour 來控制異常點的形狀 大小 邊緣
如果 notch 被設為 TRUE,見下圖
p1 <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_boxplot(aes(fill = factor(cyl)),
width=0.5, outlier.colour = "dodgerblue", outlier.size = 4, outlier.shape = 16, outlier.stroke = 2, notch=T) + labs(title="Box plot") # boxplot p2 <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_violin(aes(fill = factor(cyl)), width=0.5, trim=F) + labs(title="Violin plot (untrimmed)") # violin plot gridExtra::grid.arrange(p1, p2, ncol=2)

密度圖
ggplot(mtcars, aes(mpg)) + geom_density(aes(fill = factor(cyl)), size=2) + labs(title="Density plot") # Density plot

瓦片圖(熱力圖)
corr <- round(cor(mtcars), 2)#生成相關系數矩陣 對稱的 df <- reshape2::melt(corr) gg <- ggplot(df, aes(x=Var1, y=Var2, fill=value, label=value)) + geom_tile() + theme_bw() + geom_text(aes(label=value, size=value), color="white") + labs(title="mtcars - Correlation plot") + theme(text=element_text(size=20), legend.position="none") library(RColorBrewer) p2 <- gg + scale_fill_distiller(palette="Reds") p3 <- gg + scale_fill_gradient2() gridExtra::grid.arrange(gg, p2, p3, ncol=3)

相同坐標軸范圍
ggplot(diamonds, aes(x=price, y=price+runif(nrow(diamonds), 100, 10000), color=cut)) + geom_point() + geom_smooth() + coord_equal()
自定義布局
gridExtra包能在一個網格中安排放置多個圖形
library(gridExtra) grid.arrange(plot1, plot2, ncol=2)
改變主題
切換不同的內置主題:
- theme_gray()
- theme_bw()
- theme_linedraw()
- theme_light()
- theme_minimal()
- theme_classic()
- theme_void()
ggthemes 包提供 另外的主題 這些主題模仿啦一些著名雜志或者軟件的風格
#從 CRAN下載穩定版
install.packages('ggthemes', dependencies = TRUE)
#或者下載開發者版本
library("devtools")
install_github(c("hadley/ggplot2", "jrnold/ggthemes"))
ggplot(diamonds, aes(x=carat, y=price, color=cut)) + geom_point() + geom_smooth() +theme_bw() + labs(title="bw Theme")

注記
library(grid)
my_grob = grobTree(textGrob("This text is at x=0.1 and y=0.9, relative!\n Anchor point is at 0,0", x=0.1, y=0.9, hjust=0,gp=gpar(col="firebrick", fontsize=25, fontface="bold")))
ggplot(mtcars, aes(x=cyl)) + geom_bar() + annotation_custom(my_grob) + labs(title="Annotation Example")

保存圖片
plot1 <- ggplot(mtcars, aes(x=cyl)) + geom_bar()
ggsave("myggplot.png") # 保存最近創建的圖片
ggsave("myggplot.png", plot=plot1) #保存指定的圖形
相關鏈接:
非常有用:https://ggplot2.tidyverse.org/reference/
Cheatsheets:http://www.rstudio.com/wp-content/uploads/2015/12/ggplot2-cheatsheet-2.0.pdf
教程:http://r-statistics.co/ggplot2-Tutorial-With-R.html
https://ggplot2.tidyverse.org/
時間序列畫圖包:http://rpubs.com/sinhrks/plot_ts
