使用R的ggplot2可以实现精美的可视化展示,但是有一些杂志期刊或者毕业论文会要求不能用颜色来区分图例,要实现即使在黑白图状态下也能识别图例,即改用形状来区分图例。本篇文章主要就折线图和柱状图进行说明(目前作者还尚不知如何使用形状来填充柱状图,如果你有更好的办法可以在评论区进行补充交流)。
一.折线图
折线图要演示的数据:
dt
数据如下:
准备做一个以season为x轴,mean为y轴,pollutant为类别(图例)的时间序列图
- 用颜色区分折线图图例
library(ggplot2)
ggplot(dt,aes(x=season,y=mean,col = pollutant))+
geom_line(size=0.8)
2. 用线型区分折线图图例
ggplot(dt,aes(x=season,y=mean,col = pollutant))+
geom_line(aes(linetype = pollutant),size=0.8)
3. 用形状区分折线图图例
ggplot(dt,aes(x=season,y=mean,col = pollutant))+
geom_line(size=0.8)+
geom_point(aes(shape=pollutant),size=3)
分面组图例子
上面的简单图用excel也可以实现,而且相对更方便,我一般更多的用ggplot2包来实现面板数据的图形展示。我们有时候需要展示多个城市的时间序列图,在excel里只能实现单独一个城市一个图,且不便于比较。ggplot2的分面功能可以实现一页多图的功能,即所有城市的时间序列图在一张图中一次性展示。
数据如下:
dt2<-data.frame(season = 1:4,
mean = c(70,85,90,120,80,87,99,110,
69,90,85,100,90,76,95,112),
pollutant = c('NO2','NO2','NO2','NO2','PM2.5','PM2.5','PM2.5','PM2.5',
'NO2','NO2','NO2','NO2','PM2.5','PM2.5','PM2.5','PM2.5'),
city=c('北京','北京','北京','北京','北京','北京','北京','北京',
'天津','天津','天津','天津','天津','天津','天津','天津'))
dt2
即在数据dt的基础之上加入了截面数据——城市数据。
ggplot(dt2,aes(x=season,y=mean,col = pollutant))+
geom_line(size=0.8)+
geom_point(aes(shape=pollutant),size=3)+
facet_wrap(city~.,nrow=2,scales="free_x")+ #实现一页多图,按城市分面,
#nrow=2表示2行,即小图按两行排列,也可以根据需求设置列ncol=2
# scale标尺(free_x,free_y,free)选择free_x表示共用y轴
scale_color_manual(values=alpha(c("#70AD47","#4472C4")))+ #除了默认颜色以外,也可以自定义颜色
scale_x_continuous(labels = c("spring","summer","autumn","winter"))+ #把x轴刻度值标签改成“春夏秋冬”
theme(legend.text=element_text(face ="bold"), #图例的PM2.5、NO2字体改成bold字体
legend.position = "top", #图例位置改为图上方
legend.title=element_blank(), #隐藏图例“pollutant"
strip.text = element_text(face ="bold",size = 10), #设置单个图的类别标题文本的字体及大小(即小图中的“北京”、”天津“)
axis.title =element_text(face = "bold"), #设置坐标标题文本
axis.title.x=element_blank())+ #隐藏x轴名称
ylab("浓度均值")
二.柱状图
柱状图要演示的数据:
dt3<-data.frame(season = 1:4,
mean = c(40,45,40,20,30,15,20,10,30,40,40,70),
level = c('A','A','A','A','B','B','B','B','C','C','C','C'))
dt3
- 用颜色区分柱状图图例
主要用堆积柱状图进行演示。
ggplot(dt3,aes(x=season,y=mean,fill=level))+
geom_bar(stat="identity",position = position_stack(reverse = TRUE)) #position = position_stack(reverse = TRUE)是先让类别“A”先在下面堆积
2. 用灰度区分柱状图图例
ggplot(dt3,aes(x=season,y=mean,fill=level))+
geom_bar(stat="identity",position = position_stack(reverse = TRUE))+
scale_fill_grey(start=0,end=1)
能力有限,目前我还未能实现用形状来填充柱状图,大家如果有更好的办法欢迎在评论区交流。
[1][2]