ggplot2繪圖系統——添加標簽與文本、數學表達式、條形圖文本、注釋
1. 文本與標簽添加
-
geom_label的文本將以標簽形式出現,即文本會帶有一個背景色。
-
geom_text則是純文本形式展示。
-
annotaete函數則在圖上添加一個注釋圖層。
文本與標簽區別
p <- ggplot(mtcars,aes(wt,mpg,label=rownames(mtcars)))
a <- p+geom_text()
b <- p+geom_label()
gridExtra::grid.arrange(a,b,ncol=2)
將散點與文本組合在一起。
p+geom_point(color='dodgerblue')+
geom_text(nudge_x = 0.15, #將文本整體位置平移
angle=45) #文本傾斜
變量映射。
scale_color_manual(values=c('black','white','gray'))
因為同時映射了填充色和字體顏色,所以圖例中出現字母a,目前還不能很好去掉。建議除了label映射外,不要進行多余映射。
2.數學表達式添加
數學表達式本質也是一種文本,但需要解析,如parse參數。
df <- data.frame(x=1:8,y=1.2+x^2)
ggplot(df,aes(x,y))+geom_point()+
geom_smooth()+
geom_text(aes(x=4,y=40),label='y == 1.2 +x^2',
parse = TRUE, size=7)
3. 在條形圖上添加文本
#條形圖上添加文本
df <- data.frame(x=factor(c(1,1,2,2,2,1)),
y=c(18,31,22,14,19,32),
grp=c('a','b','a','b','c','c'))
ggplot(df,aes(x=x,y=y,fill=grp))+
geom_bar(stat = 'identity',position = 'dodge')+
geom_text(aes(y=y+1,label=y),position = position_dodge(0.9))
#在y+1處添加文本,使之在條柱上方,內容為y
#postion_dodge函數表示標簽據條柱中心位置的偏移量
堆棧式條圖文本
df <- transform(df,mid_y=ave(df$y,df$x,FUN = function(var)
cumsum(var)-(0.5*var)))
#ave分類匯總統計函數,類似tapply。根據x不同水平計算函數y值
ggplot(data=df,aes(x,y,fill=grp,label=y))+
geom_bar(stat='identity')+
geom_text(aes(y=mid_y),size=9)
上圖堆棧順序不對,兩次翻轉調整。
df <- transform(df,mid_y=ave(ave(df$y,df$x,FUN=rev),
df$x,FUN = function(var)
cumsum(var)-(0.5*var)))
#根據x水平對y進行翻轉
ggplot(data=df,aes(x,y,fill=grp,label=y))+
geom_bar(stat = 'identity')+
geom_text(aes(y=ave(df$mid_y,df$x,FUN=rev)),size=9)
#再次翻轉
ggplot(df,aes(x,y,fill=grp,label=y))+
geom_bar(stat='identity')+
geom_text(aes(y=mid_y),size=9,
position = position_stack(vjust=0.5))
結合位置函數簡化代碼。
df <- data.frame(x=factor(c(1,1,2,2,2,1)),
y=c(18,31,22,14,19,32),
grp=c('a','b','a','b','c','c'))
ggplot(df,aes(x=x,y=y,fill=grp))+
geom_bar(stat = 'identity',position = 'stack')+
geom_text(aes(label=y),position = position_stack(vjust = 0.5),size=6)
4.注釋添加
annotate函數在圖上某個位置或某區域添加注釋,無需映射變量,只需指定位置。
除了添加文本外,還可在任意位置添加散點、矩形、線段等元素。
a <- p+annotate("text",x=4,y=25,label='I love R',
size=5,color='forestgreen')
#添加矩形
b <- p+annotate('rect',xmin=3,xmax=4.2,ymin=12,
ymax = 21,alpha=.2,fill='forestgreen')
#線段
c <- p+annotate('segment',x=2.5,xend=4,y=15,
yend=25,color='blue')
#點線段
d <- p+annotate('pointrange',x=3.5,y=20,ymin=12,
ymax=28,color='red',size=1.5)
grid.arrange(a,b,c,d,ncol=4)