首页 理论教育 ggplot绘制嵌套图表:折线图和条形图的合并验证

ggplot绘制嵌套图表:折线图和条形图的合并验证

时间:2023-11-19 理论教育 版权反馈
【摘要】:嵌套图表,就是放置在大图表中的小图表。ggplot2包中的ggplot Grob和annotation_custom函数可用于绘制嵌套图表。在for循环中,我们先绘制折线图并将其转化成grob对象,再把它传递给annotation_custom,并放入列表L中width=8 # 确定一个合适的宽度height=0.8 # 高度最好与条形图中条形的宽度相同L=as.listfor {iv=dat[, i]ip=ggplot()+geom_line+coord_cartesian+theme_void()ip=ggplot GrobL[[i]]=annotation_custom}# 第三步:把条形图跟列表L合并v2018_lab=round_textbar+L+scale_x_continuous+ # X轴左边留出空间放置文字geom_text+labs+theme_minimal+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=el

ggplot绘制嵌套图表:折线图和条形图的合并验证

嵌套图表,就是放置在大图表中的小图表。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)

)

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈