互动图表,是指显示内容可根据用户操作做出相应改变的图表。能够生成互动图表的R包有apexcharter、plotly、animint2、r Am Charts、ggiraph等,本节将介绍ggiraph包的使用方法。尽管这个包仅可生成相对简单的互动图表,但其使用方法与ggplot2包相仿,学习起来相对容易。
我们首先以2000年至2015年美国枪支销售数据为例,来介绍函数的使用方法。
# install.packages("ggiraph")
library(ggiraph)
library(ggplot2)
library(dplyr)
options(scipen=12)
dat=read.csv("gun.csv", row.names=1) # 课件中的文件
# 第一步:生成静态图表
dat=mutate(dat, tip=paste(year, "<br>", "Total Purchase: ", format (total, big.mark=", "), sep="")) # 生成一列能够在鼠标指向特定位置时显示出来的标签。此处需使用"<br>"(而不是"\n")代表换行。注意:标签中的中文会变成乱码
dat=mutate(dat, te=paste(round(total/1000000, 1), "m", sep="")) # 出于示范的目的,我们再生成一列字符
p=ggplot(dat)+
geom_line(aes(x=year, total), size=1)+
geom_point_interactive(aes(x=year, y=total, tooltip=tip, data_id=year), size=4, color="red")+
geom_text_interactive(aes(x=year, y=total, tooltip=tip, data_id=year, label=te), vjust=-1)+
geom_bar_interactive(show.legend=FALSE, aes(x=year, y=total, fill=factor(year), tooltip=tip, data_id=year), stat="identity", alpha=0.2)+
scale_fill_manual(values=rainbow(nrow(dat)))+
scale_x_continuous(breaks=dat$year)+
scale_y_continuous(labels=function(x) format(x, big.mark=", "))+
theme_minimal()+
theme(axis.text.x=element_text(size=12, angle=30, hjust=1))
# 第二步:生成互动图表
girafe(ggobj=p) # 务必写明参数名为ggobj
为了生成互动效果,我们在第一步中把ggiraph包中的geom_point_interactive函数跟ggplot2包中的函数放在一起使用。事实上,ggiraph包有大量形如geom_*_interactive的函数,与ggplot2包中的geom_*函数相仿。区别在于,在前者中,我们可使用tooltip和data_id参数:tooltip用于设定鼠标悬停时的标签,data_id用于设定鼠标悬停时形状属性的改变,并且使具有相同data_id取值的图形属性同时发生改变。在第二步中,我们用girafe函数把由第一步生成的静态图表,修改成了互动图表(读者在使用Rstudio时,可点击Show in new window,以便用浏览器查看或保存互动图表)。下面我们来对girafe的参数进行调整。
## 调整互动图表的宽和高
girafe(ggobj=p, width_svg=6, height_svg=3) # 以英寸为单位,默认值为6和5
## options参数的值为一个列表,这个列表需进一步使用opts_tooltip等函数设定# 鼠标悬停标签的属性均用opts_tooltip设定
girafe(ggobj=p,
options=list(
opts_tooltip(
offx=20, offy=-10, # 标签距离图形的距离,默认值为10和0
opacity=0.7, # 透明度,默认值为0.9
delay_mouseover=1000, delay_mouseout=3000, # 鼠标悬停多少毫秒后显示或消除标签,默认值为500和999
use_fill=TRUE, use_stroke=FALSE # 是否使用图形的填充色和轮廓,默认值均为FALSE
)
)
)
## opts_tooltip还可使用css参数
css_cha="color: red; font-size:1cm; font-style: italic; fontweight: bold; font-family: Bookman Old Style; text-align: center; line-height: 1.5cm; background-color: orange; padding: 3mm; borderradius: 5mm; border-style: dotted; border-width: 1mm; border-color: green"
girafe(ggobj=p, options=list(opts_tooltip(css=css_cha)))
## css参数的取值为一个字符,用冒号分隔属性名为取值,用分号分隔不同的属性。常用的属性及设置方法有:
# color: red:文字颜色(使用十六进制表示法,R中的部分颜色名亦可用)
# font-size: 1cm:文字尺寸。需加上cm、px、mm等单位
# font-style: italic:正常(normal)、粗体(bold)或斜体(italic)
# font-weight: bold:不加粗(normal)或加粗(bold)
# font-family: Bookman Old Style:字体。可使用操作系统里的字体
# text-align: center:对齐方式。选项为left、center、right
# line-height: 1.5cm:行高。取值应大于文字尺寸,并需加上单位
# background-color: orange:背景色
# padding: 3mm:文字到边框的距离。需加上单位
# border-radius: 5mm:边框圆滑程度,需加上单位
# border-style: dotted:边框线形。选项为solid、dashed、dotted
# border-width: 1mm:边框宽度。需加上单位
# border-color: green:边框颜色
## 在options参数中,使用opts_hover函数修改鼠标悬停时,图形属性的变化 girafe(ggobj=p,
options=list(opts_hover(css="fill: green; stroke: blue; strokewidth: 0.5mm"))
)
##由于我们设置了条形与文字共变,所以文字在鼠标悬停时也有了蓝色边缘,但这并不是我们想要的。此时,我们可把css参数指向girafe_css函数进行更精细的调整(请用?girafe_css查看使用方法)
girafe(ggobj=p,
options=list(
opts_hover(
css=girafe_css(
css="fill: green; stroke: blue; stroke-width: 0.5mm", # 通用属性(此处仅用于点的属性)
text="stroke: none; fill: magenta", # 文字属性
area="stroke: gold; fill: grey" # 面的属性(此处为条形的属性)
)
)
)
)
## opts_zoom函数用于设置放大。使用者可使用图表右上角的按钮或点击图表来放大图表
girafe(ggobj=p, options=list(opts_zoom(max=5))) # 设定最大放大倍数为5
#==========
# 练习:用互动图表呈现基尼系数
#==========
# 在图8-1-1中,X轴和Y轴的值域相同。点落在45度线上,意味着税前和税后基尼系数相等。而事实上,所有点均位于该线以下,意味着税后基尼系数均低于税前基尼系数。图表使用的是2016年基尼系数和人口数
library(readxl)
library(ggrepel)
dat=read_excel("gini.xlsx") # 课件中的文件(www.xing528.com)
dat=as.data.frame(dat)
dat=mutate(dat, tip=paste(Country, "<br>", "Before: ", Before,"<br>", "After: ", After, "<br>", "Individual: ", Individual)) # 鼠标悬停时的标签
small=0.2; big=0.55 # 手动确定坐标轴值域
p=ggplot(dat)+coord_fixed()+
geom_point_interactive(aes(x=Before, y=After, size=Individual, fill=Area, tooltip=tip, data_id=Country), alpha=0.9, shape=21, color="grey65")+ # 点的大小取决于人口数,颜色取决于所在地区
geom_segment(aes(x=small, y=small, xend=big, yend=big), color="grey65", size=0.4)+
geom_text_repel(aes(x=Before, y=After, label=Country), color="grey80", segment.color="grey60", size=2.5, segment.size=0.3, seed=1)+
scale_x_continuous(name="Gini Index (BEFORE Taxes and Transfers)", limits=c(small, big))+
scale_y_continuous(name="Gini Index (AFTER Taxes and Transfers)", limits=c(small, big))+
scale_fill_manual(
name="The size of a circle\nis in propotion\nto the number of\nindividuals.\n\n Area", # 把图例标题改成说明文字
values=c("Europe"="mediumseagreen", "North America"="orangered", "Asia"="yellow", "Oceania"="deeppink3"),
guide=guide_legend(override.aes=list(size=5))
)+
scale_size_continuous(range=c(3, 9), guide="none")+
geom_text(aes(x=-Inf, y=Inf, label="Income Inequality\n(Gini Index)\n Before and After\n Taxes & Transfers"), hjust="left", vjust="top", color="grey80", size=7, family="serif")+
theme_minimal()+
theme(plot.background=element_rect(fill="grey20"),
panel.grid=element_line(color="grey30"),
legend.text=element_text(color="grey60", size=13),
axis.text=element_text(color="grey60", size=13),
title=element_text(color="grey60", size=13)
)
girafe(ggobj=p,
options=list(
opts_tooltip(css="color: grey60",
offx=0, offy=-40,
use_fill=TRUE
),
opts_zoom(max=5),
opts_hover(css="fill: #98F5FF")
)
)
图8-1-1 用互动图表呈现基尼系数
#==========
# 练习:用互动图表呈现各国原油产量
#==========
# 在下面的堆积图(图8-1-2)中,我们添加了宽度为1的矩形,它们几乎是透明的,仅当鼠标指向它们时才会显示出来。另外,我们还把悬停标签的内容设置为各国年产量排序
library(unikn)
dat=read.csv("oil.csv", row.names=1) # 课件中的文件
dat$Production=round(dat$Production, 0)
all_year=sort(unique(dat$Year))
xlab=all_year[all_year %% 5 == 1] # X轴标签
mycolor=seecol(pal=pal_unikn_pref, n=length(unique(dat$Country))) #提取unikn包中的配色
names(mycolor)=NULL # 务必去掉颜色名,否则scale_fill_manual无法使用
# 生成鼠标悬停标签的内容
tooltip=group_by(dat, Year)
order_and_paste=function(a, b){ # 编写一个用于排序并生成标签的函数
o=order(b, decreasing=TRUE)
b=b[o]; a=a[o]
b=format(b, big.mark=", ")
res=paste(1: length(a), " ", a, ": ", b, sep="")
paste(res, collapse="<br>")
}
tooltip=summarize(tooltip, lab=order_and_paste(Country, Production))
tooltip=paste(tooltip$Year, "<br><br>", tooltip$lab, sep="")
p=ggplot()+
geom_area(data=dat, aes(Year, Production, fill=Country), position="stack")+
geom_bar_interactive(aes(x=all_year, y=Inf, tooltip=tooltip, data_id=all_year), stat="identity", width=1, fill="white", alpha=0.2)+
scale_fill_manual(values=mycolor)+
scale_x_continuous(breaks=xlab, limits=c(min(all_year)-0.5, max(all_year)+0.5), expand=expansion(0))+
scale_y_continuous(labels=function(x) format(x, big.mark=", "), expand=expansion(0))+
labs(title="Crude Oil Production 1971 ~ 2017", subtitle="(unit: TOE)", fill="Country")+
theme_minimal(base_size=15)+
theme(axis.text.x=element_text(angle=20),
axis.title=element_blank(),
plot.title=element_text(size=22, face=2),
plot.subtitle=element_text(size=18, face=3)
)
girafe(ggobj=p, width_svg=7, height_svg=4,
options=list(
opts_hover(css="fill: cyan"),
opts_tooltip(css="background-color: #FFB90F; color: black")
)
)
图8-1-2 用互动图表呈现原油产量
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。