ggplot2 多个柱状图比较_如何实现ggplot2不用颜色,改用形状来区分图例

fd370990380acc2059f6ddc7837fedb2.png

使用R的ggplot2可以实现精美的可视化展示,但是有一些杂志期刊或者毕业论文会要求不能用颜色来区分图例,要实现即使在黑白图状态下也能识别图例,即改用形状来区分图例。本篇文章主要就折线图和柱状图进行说明(目前作者还尚不知如何使用形状来填充柱状图,如果你有更好的办法可以在评论区进行补充交流)。

一.折线图

折线图要演示的数据:

dt

数据如下:

e39a16ab99d756c1af5afac2b7de198a.png

准备做一个以season为x轴,mean为y轴,pollutant为类别(图例)的时间序列图

  1. 用颜色区分折线图图例
library(ggplot2)
ggplot(dt,aes(x=season,y=mean,col =  pollutant))+
  geom_line(size=0.8)

48499a1fc5ab6f8144dd4ed0522a5195.png

2. 用线型区分折线图图例

ggplot(dt,aes(x=season,y=mean,col =  pollutant))+
  geom_line(aes(linetype = pollutant),size=0.8)

22737ba6da00879ba9be0e03d142b2c5.png

3. 用形状区分折线图图例

ggplot(dt,aes(x=season,y=mean,col =  pollutant))+
  geom_line(size=0.8)+  
  geom_point(aes(shape=pollutant),size=3)

513831263c5959423ce8410cabf0ed48.png

4. 分面组图例子

上面的简单图用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

36e3be6ffaf5609571dc96f22c1a664e.png

即在数据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("浓度均值")

40598c3076d2482607bb537763295850.png

二.柱状图

柱状图要演示的数据:

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

39ebdf5e5ccd351dc1003f020fea087e.png
  1. 用颜色区分柱状图图例

主要用堆积柱状图进行演示。

ggplot(dt3,aes(x=season,y=mean,fill=level))+
  geom_bar(stat="identity",position = position_stack(reverse = TRUE))  #position = position_stack(reverse = TRUE)是先让类别“A”先在下面堆积

3402d00fdf029ba42c2861b74175ba68.png

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)

41a3ad4272ff908deae3acf144150d7c.png

能力有限,目前我还未能实现用形状来填充柱状图,大家如果有更好的办法欢迎在评论区交流。

[1][2]

参考

  1. ^http://blog.sina.com.cn/s/blog_670445240102v8xd.html
  2. ^https://blog.csdn.net/xspyzm/article/details/69665099?utm_source=blogxgwz8
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值