首页 理论教育 ggplot实现政经数据可视化

ggplot实现政经数据可视化

时间:2023-11-19 理论教育 版权反馈
【摘要】:在上例中,当添加圆形时,shape参数的值就是dat,一个包含圆形坐标的数据框。在未设置height并且raster是图片时,输出图形的宽和高将等于该对象的宽和高。当raster是图片时,若height="image",则输出结果的尺寸等同于该图片的尺寸。我们来尝试绘制一个包含图片的条形图,数据为2017年若干国家的研发投入占GDP的比重。

ggplot实现政经数据可视化

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的宽和高

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

我要反馈