首页 理论教育 使用ggiraph包生成互动图表,简单易学

使用ggiraph包生成互动图表,简单易学

时间:2023-11-19 理论教育 版权反馈
【摘要】:互动图表,是指显示内容可根据用户操作做出相应改变的图表。能够生成互动图表的R包有apexcharter、plotly、animint2、r Am Charts、ggiraph等,本节将介绍ggiraph包的使用方法。尽管这个包仅可生成相对简单的互动图表,但其使用方法与ggplot2包相仿,学习起来相对容易。在第二步中,我们用girafe函数把由第一步生成的静态图表,修改成了互动图表。

使用ggiraph包生成互动图表,简单易学

互动图表,是指显示内容可根据用户操作做出相应改变的图表。能够生成互动图表的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文字尺寸需加上cmpxmm等单位

# font-style: italic正常normal)、粗体bold或斜体italic

# font-weight: bold不加粗normal或加粗bold

# font-family: Bookman Old Style字体可使用操作系统里的字体

# text-align: center对齐方式选项为leftcenterright

# line-height: 1.5cm行高取值应大于文字尺寸并需加上单位

# background-color: orange背景色

# padding: 3mm文字到边框的距离需加上单位

# border-radius: 5mm边框圆滑程度需加上单位

# border-style: dotted边框线形选项为soliddasheddotted

# 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 用互动图表呈现原油产量

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

我要反馈