plothelper包中的annotation_shading_polygon用于添加带有渐变色或图片的多边形,annotation_transparent_text用于添加透明或带有渐变色的文字。
library(plothelper)
library(magick)
library(ggfittext)
## 以添加渐变圆形和带渐变效果的图片为例(图6-4-1)
# 第一步:生成圆形坐标,读入图片
dat=ellipsexy(x=0, y=0, a=1, b=1)
img=image_read("red leaf.png") # 课件中的图片
# 第二步:根据需要生成颜色矩阵
m1=matrix(c(
"khaki1", "khaki1", "cyan3",
"khaki1", "cyan3", "darkslateblue",
"cyan3", "darkslateblue", "darkslateblue"), byrow=TRUE, nrow=3)
m1=enlarge_raster(m1, 20) # 增加颜色的数量
m2=color Ramp Palette(c("red", "orange", "yellow"))(20)
m2=matrix(m2, nrow=1)
# 第三步:合并
ggplot()+coord_fixed()+theme_void()+
annotation_shading_polygon(shape=dat, raster=m1)+
annotation_shading_polygon(shape=img, raster=m2, xmin=1, xmax=4, ymin=-1, ymax=1)
图6-4-1 渐变多边形
下面我们介绍annotation_shading_polygon的参数:
●shape、xmin、xmax、ymin、ymax:多边形及其位置。设置方法为:(a)当shape是一个用于绘制多边形并只包含两列(即X坐标和Y坐标)的数据框时,除非对xmin等位置参数进行修改,否则图形会被添加在该数据框所设定的位置。在上例中,当添加圆形时,shape参数的值就是dat,一个包含圆形坐标的数据框。(b)当shape是已经用ggplot画好的、使用数值坐标轴或离散坐标轴的图表时,函数会根据这个图表的位置,自动确定在新图表上进行绘制的位置(见以下示例),但亦可用xmin等位置参数指定一个新位置。(c)当shape是用magick::image_read读入的PNG格式的图片时,必须给出xmin等位置参数,否则会报错。
●raster:颜色矩阵、raster对象或者用magick::image_read读入的图片。
●interpolate:当raster是颜色矩阵或raster对象时,是否对颜色进行平滑处理(默认值为TRUE)。
●result_interpolate:是否对最后生成图形的颜色进行平滑处理(默认值为TRUE)。
●shape_trim、raster_trim、result_trim:这三个参数用于确定是否对shape、raster以及输出结果进行处理,以便裁剪掉多余的边缘(比如图片的白边)。三个参数的默认值为NULL,即不裁剪。如果参数值为0至100的数据,函数将调用image_trim函数进行裁剪,数据越大,裁剪掉的边缘越多。
●result:当其为"layer"(默认)时,输出结果为ggplot图层。当其为"magick"时,输出结果为magick对象。
●res:图片分辨率,默认值为72。
●width、height:输出图形的尺寸(当result="magick"时)或图层的相对尺寸(当result="layer"时)。需分情况确定这两个参数,有时要进行多次尝试:(a)在默认状态下,width为800,如果图形不够清晰时,可增大width,或同时调整width和height。(b)height可用字符的形式设置为比例。比如,当width=1000时,若设置height="0.8",那么图形的高将为1000*0.8=800。(c)当shape是数据框或已经用ggplot绘制好的图表时,若设置height="coord_fixed",那么输出图形的高宽比将根据shape的高宽比来确定。(d)在未设置height并且raster是图片时,输出图形的宽和高将等于该对象的宽和高。(e)当raster是图片时,若height="image",则输出结果的尺寸等同于该图片的尺寸。(f)当height=NULL(默认)并且shape是数据框或已经用ggplot绘制好的图表时,函数会自动确定高度,确定方法是:当shape的高度过大(大于宽度的5倍)时,高度会被强制改为width*5;当高度过于小(小于宽度的1/5)时,高度会被改为width*0.2;如果宽度既未过大也未过小,则按(c)进行设置。
我们来尝试绘制一个包含图片的条形图,数据为2017年若干国家的研发投入占GDP的比重(图6-4-2)。
dat=read.csv("rd gdp.csv", row.names=1) # 课件中的文件
# 第一步:绘制条形图。为了简化操作,我们对数据框进行了重排,并且在geom_bar中使用了数值坐标(x=1: n)
n=nrow(dat)
o=order(dat$Value)
dat=dat[o, ]
bar=ggplot()+geom_bar(aes(x=dat$Value, y=1: n), stat="identity", orientation="y")
# 第二步:读入图片
img=image_read("chips.jpg") # 课件中的文件
# 第三步:合并
p=ggplot()+annotation_shading_polygon(shape=bar, raster=img, width=1000, res=144)
v=round(dat$Value, 2)
lab=dat$Country
lab=scales::wrap_format(9)(lab)
p+geom_text(aes(dat$Value, 1: n, label=v), hjust=-0.2, size=5, fontface=3, color="darkgreen")+
geom_fit_text(aes(xmin=2, xmax=4, ymin=0.55, ymax=3.5, label="R& D\n Expenditure\n(% of GDP)"), grow=TRUE, reflow=FALSE, fontface=2, place="bottomright", color="chocolate1")+ # 将图片名称添加到右下角
scale_x_continuous(name=NULL, limits=c(0, 4), expand= expansion(0.01))+
scale_y_continuous(name=NULL, breaks=1: nrow(dat), labels= lab)+
theme_void()+
theme(axis.title=element_text(size=15),
axis.text.y=element_text(size=12, face=2, color="chocolate1"), axis.ticks.y=element_line(size=1.2)
)
图6-4-2 用annotation_shading_polygon绘制条形图
我们再来绘制一条阴影区域包含渐变色的曲线。本例使用的数据为2007至2017年全球艺术品销售总额(图6-4-3)。(www.xing528.com)
图6-4-3 用annotation_shading_polygon绘制带阴影的曲线
dat=read.csv("art0717.csv", row.names=1) # 课件中的文件
# 第一步:绘制带阴影的曲线。为方便后续操作,我们把X轴变量改为数值。此处需要的函数不是geom_line,而是geom_area,因为事实上我们需要的是一片阴影,而不只是一条曲线
area=ggplot()+geom_area(data=dat, aes(Year, Value))
# 第二步:生成渐变色。本例只让单一颜色的透明度发生渐变
m=scales::alpha("#f7b79e", seq(0.9, 0.01, length.out=20))
m=matrix(m)
# 第三步:合并。注意:为了让最左边的点和文字完整地显示出来,我们去掉了Y轴,同时用geom_line画了一个假的Y轴
p=ggplot()+annotation_shading_polygon(shape=area, raster=m, width=1000, res=144)
p+geom_line(aes(x=min(dat$Year), y=c(0, max(dat$Value)*1.2)), size=1.5, color="#ee9974")+
geom_line(data=dat, aes(Year, Value), color="#ee9974", size=2)+
geom_point(data=dat, aes(Year, Value), color="#ee9974", size= 5)+
geom_text(data=dat, aes(Year, Value, label=Value), color=
"lightcyan", size=6.5, family="Hershey Serif", fontface=2)+
scale_x_continuous(name=NULL, breaks=sort(dat$Year))+
scale_y_continuous(name=NULL, limits=c(0, NA), expand=expansion (0))+
labs(title="Sales in the Global Art Market 2007~2017", subtitle="(unit: billion $)\n")+
theme_void()+
theme(plot.background=element_rect(fill="#38849c"),
plot.title=element_text(family="Hershey Serif", color="lightcyan", face=2, size=21),
plot.subtitle=element_text(family="serif", color="lightcyan", face=3, size=20),
axis.text=element_text(size=15, family="Hershey Serif", face= 2, color="#ee9974"),
axis.text.x=element_text(angle=20),
plot.margin=unit(rep(5, 4), "mm")
)
下面来学习annotation_transparent_text的使用方法。它的参数有:
●label、xmin、xmax、ymin、ymax:待添加的文字及其位置。
●bg:文字背景。当bg为一个颜色值时,文字将会出现在一个有颜色的半透明矩形中。此外,bg还可以是一个颜色矩阵、raster对象或由magick::image_read读入的图片。
●alpha:由bg所指定的颜色的透明度。
●operator:image_composite函数使用的operator参数。当其为"out"(默认)时,bg与label重合的部分将会被去掉,从而生成透明文字。当其为"in"时, bg与label重合的部分会被保留,从而生成包含渐变色或图片的文字。
●expand:是否为确保文字能够完整显示而对由xmin、xmax、ymin、ymax确定的位置进行微小扩展。取值应为两个数值,用于确定X坐标和Y坐标的扩展比例。默认值为c(0.05, 0.05)。
●family、fontface、reflow、place、...:传递给geom_fit_text的参数(...指的是lineheight、angle等参数)。注意:family的默认值为"Sim Hei"。
●label_trim、bg_trim:是否对由geom_fit_text生成的文字框进行裁剪,以及是否对bg进行裁剪。两个参数的默认值为NULL,即不裁剪;如果取0至100的数值,则值越大裁剪的越多。
●interpolate、result_interpolate、result、res:请参考annotation_shading_polygon的同名参数。
●width、height:输出结果的宽和高。这两个参数的使用方法与annotation_shading_polygon的同名参数相近。我们要通过反复尝试,来找到合适的设置方法。在下边的示例中,我们使用了三种不同的设置方法。
# 示例一:添加放在黑色文字框中的透明文字。注意,我们设置文字框的宽度远大于高度,在这种情况下,我们既可以不修改height,也可以根据需要进行修改(图6-4-4a)
m=color Ramp Palette(c("darkolivegreen", "darkolivegreen4", "darkolivegreen3","darkolivegreen1", "gold", "darkorange", "orangered"))(20)
m=matrix(m, nrow=1)
ggplot()+xlim(0, 100)+ylim(-0.2, 1.2)+theme_void()+
coord_cartesian(expand=FALSE)+
annotation_raster(m, xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf, interpolate=TRUE)+
annotation_transparent_text(label="PROTECT\n OUR\n ENVIRONMENT", xmin=0, xmax=100, ymin=0, ymax=1, bg="black", alpha=0.6, family="serif", fontface=2, lineheight=0.8, place="left", expand=c(0.01,0.01), res=144, width=1000, height=600) # 直接为height赋值
图6-4-4 左=图a添加透明文字,中=图b添加带渐变色的文字, 右=图c添加带图片的文字
# 示例二:将operator改为"in"并添加带渐变色的文字(图6-4-4b)
ggplot()+theme_void()+
theme(plot.background=element_rect(color=NA, fill="gray20"))+
annotation_transparent_text(label="保护环境\n保护森林", xmin=0, xmax=100, ymin=0, ymax=1, bg=m, operator="in", res=144, width=1000, height="0.5") # height为比例
# 示例三:将operator改为"in"并添加带图片的文字。为使字体填满空间,我们设定label_trim=0以便去掉文字框的边缘(图6-4-4c)
img=image_read("leaf.jpg")
ggplot()+theme_void()+
theme(plot.background=element_rect(color=NA, fill="aquamarine2" ))+
annotation_transparent_text(label="PROTECT\n OUR\n ENVIRONMENT",xmin=0, xmax=1000, ymin=0, ymax=1, bg=img, operator="in", family="serif", fontface=2, lineheight=0.6, place="left", label_trim=0,
res=144, width=1000, height="image") # 使用bg的宽和高
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。