嵌套图表,就是放置在大图表中的小图表。ggplot2包中的ggplot Grob和annotation_custom函数可用于绘制嵌套图表。
library(plothelper) # 使用round_text
## 把两个小图表放到大图表中
# 第一步:绘制大图表
p=ggplot()+geom_point(aes(x=1: 10, y=1: 10))
# 第二步:绘制小图表并用ggplot Grob将图表转化成grob对象
p1=ggplot()+geom_point(aes(1: 5, 1: 5))+theme(plot.background= element_rect(fill="yellow"))
p2=ggplot()+geom_bar(aes(1: 5, 1: 5), stat="identity")+theme_void()+theme(plot.background=element_rect(fill=NA, color="green", size=5)) # 注意:要确保小图表不会完全遮挡大图表,要修改小图表背景和面板的填充色
p1_grob=ggplot Grob(p1)
p2_grob=ggplot Grob(p2)
# 第三步:用annotation_custom把小图表添加到大图表中,用xmin等参数设定位置(当无法确定边界时用Inf或-Inf代替)
p+annotation_custom(grob=p1_grob, xmin=5, xmax=10, ymin=5, ymax= 15)+
annotation_custom(grob=p2_grob, xmin=2.5, xmax=Inf, ymin=-Inf, ymax=5)
下面我们要把若干国家2018年军费绘制成条形图,并把近十年来的军费绘制成折线图添加到条形图上(图7-3-1)。
图7-3-1 绘制嵌套图表
dat=read.csv("military expd.csv", row.names=1) # 课件中的文件
o=order(dat["2018", ]) # 注意:为方便后续操作,我们把各列按照2018年数据的大小进行重排
dat=dat[, colnames(dat)[o]]
# 整理数据
dat=round(dat/(10^9), 2) # 以十亿美元为单位
country=colnames(dat)
country=gsub("\\.", " ", country)
country=scales::wrap_format(10)(country)
n=length(country)
year=as.numeric(rownames(dat))
v2018=as.numeric(dat["2018", ]) # 提取2018年数据用于画条形图
# 第一步:绘制条形图
bar=ggplot()+
geom_bar(show.legend=FALSE, aes(x=v2018, y=1: n, fill=v2018), stat="identity", width=0.8, alpha=0.9, orientation="y")+
scale_fill_continuous(low="darkseagreen1", high="darkseagreen4")+
scale_y_continuous(breaks=1: n, labels=country)(www.xing528.com)
# 第二步:绘制折线图。在for循环中,我们先绘制折线图并将其转化成grob对象,再把它传递给annotation_custom,并放入列表L中
width=8 # 确定一个合适的宽度
height=0.8 # 高度最好与条形图中条形的宽度相同
L=as.list(rep(NA, n))
for (i in 1: n){
iv=dat[, i]
ip=ggplot()+geom_line(aes(x=year, y=iv), size=1.2, color="indianred")+coord_cartesian(expand=FALSE)+theme_void()
ip=ggplot Grob(ip)
L[[i]]=annotation_custom(grob=ip,
xmin=v2018[i]+2, # 加上一个较小的数值,以确保小图表与条形之间有空隙
xmax=v2018[i]+2+width,
ymin=i-height/2,
ymax=i+height/2
)
}
# 第三步:把条形图跟列表L合并
v2018_lab=round_text(v2018, 2)
bar+L+
scale_x_continuous(limits=c(0, max(v2018)+2+width), expand= expansion(c(0.2, 0.05)))+ # X轴左边留出空间放置文字
geom_text(aes(x=0, y=1: n, label=v2018_lab), size=5, color="indianred3", family="mono", fontface=3, hjust=1.2)+
labs(title="2018 Military Expenditure and 10-Year Trend", subtitle="(unit: billion current $)")+
theme_minimal(base_family="serif")+
theme(axis.title=element_blank(),
axis.text=element_text(face=2, size=14, lineheight=0.7, color="grey95"),
panel.grid.minor=element_blank(),
panel.grid.major=element_line(color="#374437"),
plot.title=element_text(face=2, size=18, color="grey95"),
plot.subtitle=element_text(face=3, size=16, color="grey95"),
plot.background=element_rect(fill="grey10", color=NA)
)
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。