ggplot2-主题函数关系

ggplot2的主题函数的规律:
1.主题反应的是风格,主题函数theme一旦形成,绘图基本上没有太大改动
2.主题函数theme的参数有规可寻,等号前面为图表元素名称,等号后面的函数名为图表元素的几何属性,前后为继承关系。比如,element_rect=panel.background

先看看主题设置:

library(ggplot2)
hgram <- qplot(carat,price,data=diamonds,log="xy")
previous <- theme_set(theme_bw())
hgram
# 添加之前的主题函数
hgram + previous

这里写图片描述
这里写图片描述
全局性主题设置:theme_set() 可以设置所有图形的主题,同时返回先前的主题

theme_gray()或theme_bw() 可以设置单个图形的主题,同时局部设置将会覆盖默认的全局性设置。

下面绘制主题函数的继承关系网络
工具:数据可视化图表:关系网络图 igraph包
关系数据整理
theme函数内的参数继承关系存放在element_tree的list内,通过ggplot2:::element_tree获取,:::这个函数用于获取包内的数据,这个list的每个元素包括三个属性:class,inherit,description,其中class为这个参数的类,inherit是它的父函数

library(plyr)
library(igraph)
item <- ggplot2:::.element_tree
# 列表的每个元素长度都相等
edges <- do.call('rbind', item)

# 向数据框中新增一列
edges <- transform(edges, child = row.names(edges))

# 从数据框中提取出必须的两列
edges <- edges[, c("child", "inherit")] 

# plyr包中的rename函数将变量inherit重命名
edges <- rename(edges, replace = c("inherit" = "parent"))

do.call函数将list转化为数据框
do.call函数包括两部分:call和do,call仅调用和传参

lapply的结果和do.call比较相似,但是lapply使list里面的每一个元素都调用一次函数;do.call是把list的所有元素作为参数仅调用一次函数,这是它们的本质区别。

colnames(edges) <- c("first" , "second")
ggnet <- graph.data.frame(edges, directed = TRUE)
plot(ggnet, edge.arrow.size = 0.01)

这里写图片描述

graph.data.frame创建图形对象,将数据框的前两列作为关系列表(edgelist)或边线列表,这个函数根参数directed用来定义关系的方向性(默认的是有方向性的);

上述igraph包画关系网络图时,数据格式为两列的数据框,分别为起点列和次点列。次点列是起点列的继承,如果有单独的孤立点,用NULL和NA通常都不行,下面将关系和节点分开:
关系(edges)仍然用原来的数据框格式存储但去除孤立点,而节点全部存储在另外一个单列数据框中,包括孤立点。

数据调整

ver <- data.frame(edges$first)
type <- rep(3,length(ver[,1]))
type[edges$first %in% edges$second] <- 2
type[which(edges$second == 'NULL')] <-1
edges <- edges[-which(edges$second == 'NULL'),]

首先提取所有节点作为节点数据框,然后对节点分级:一级节点没有父函数;二级节点即可以是子函数也可以作为父函数;三级节点没有子函数。

产生一个和节点ver等长的等级标记向量type,每个值均赋为3,表示三级节点(所有的函数都是子函数);
二级节点就是上面整理的父函数(parent)也就是second列,换句话说,所有在second列出现的函数均可定义为二级节点,这里包括根函数。
所以通过%in%函数在second列中查找第一列的元素,查到了就返回TRUE,没查到就返回FALSE(结果和第一列长度相同),然后将所有对应行的type值改为2,即二级节点;

一级节点就是那些second列为NULL的函数,which返回符合表达式的行编号,将对应的type赋值为1。

将edges数据框中second列为NULL的行删除就是所需的关系数据框,完成以后就可绘图了。
这时的edges关系数据框中只有三级结点和二级节点。

关系网络图

ggnet <- graph.data.frame(edges,vertices = ver)
plot(ggnet, layout = layout.fruchterman.reingold, 
     edge.arrow.size = 0.01, 
     vertex.size = 4, 
     vertex.label.dist = 0.25)

layout用于指定关系网络的坐标体系
与vertex相关的两个参数分别指定节点的大小和节点标签的位置,避免标签和节点重合。
ggnet()中vertices为节点,edges为关系数据框,其中一些节点没有二级节点,图中表示为孤立点。
这里写图片描述

修饰关系网络图

数据框的变量名由names定义,行名由rownames()定义

ver <- data.frame(ver,type)
names(ver) <- c("first", "type")
V(ggnet)$type = as.character(ver$type[match(V(ggnet)$name, ver$first)])
V(ggnet)[V(ggnet)$type == '1']$color <- rgb(112,48,160,max=255,alpha = 180)
V(ggnet)[V(ggnet)$type == "2"]$color <- rgb(235, 75, 113, max = 255)
V(ggnet)[V(ggnet)$type == "3"]$color <- rgb(0, 130, 137, max = 255, alpha = 180)

require("extrafont")
loadfonts(device="win")

par(mar = c(0,0,2,0), bg = rgb(242, 242, 242, max = 255)) 
plot(ggnet, layout = layout.fruchterman.reingold, 
     edge.arrow.size = 0.01, vertex.color = V(ggnet)$color,
     vertex.frame.color = NA, vertex.size = 8, vertex.label.dist = 0.35,
     vertex.label.cex = 0.8, vertex.label.color = V(ggnet)$color)
title(main = "ggplot2主题函数关系网络", cex.main = 1, 
      col.main = rgb(64, 64, 64, max = 255), family = "STXinwei")
png(filename = "F:/BaiduYunDownload/net3.png", width = 730, height =687)

add_credits(fontsize = 14)
dev.off()

这里写图片描述
将ver和相应的type类型捆绑为数据框,然后通过names函数重新命名数据框列名;

然后给ggnet节点创造一个新属性例type,match函数在ver firstV(ggnet) name在ver$first中的位置,这一点是match函数与%in%的不同,通过匹配的方式给每个节点添加了相应的节点级别,也就是type属性;

根据type给节点添加新属性color,不同的属性类型赋予不同的颜色值。

在rgb函数中有两种表达三色的方式:其一,红绿蓝三色的范围为0至1,相应的透明度参数的取值范围也为0至1;但是大家更加熟悉的红绿蓝三色范围为0至255,在rgb函数中也可以设置,不过要添加max参数并赋值为255,相应的透明度alpha参数的取值范围也转变为了0至255。

然后将节点的颜色属性值V(ggnet)$color指定为节点的颜色vertex.color参数;节点边框(vertex.frame.color)的颜色设置为无色;vertex.label.cex用于指定节点标签的字体大小,cex(character expansion)即R基础包调节字体大小的参数;为了使标签和节点视觉上比较统一,将节点颜色属性值指定为节点标签的颜色vertex.label.color。

使用了windows系统自带的字体华文新魏,所以加载了extrafont包。

这篇文章对关系网络图的两个重要部分做了分析,一个是关系数据框,一个是节点;如果没有专门指定vertices(节点),则直接用数据框中的前两列作为关系列表,其他的列作为关系属性;如果vertices不是空,指定一个节点数据框,那么关系列表会根据指定的节点核查关系,其他列作为额外的节点属性。

关于数据的整理,要根据变量的类型作调整,比如,graph.data.frame(d,)要求d是一个数据框

IGRAPH DN-B 55 36 -- 
+ attr: name (v/c), type (v/n)
+ edges (vertex names):
 [1] title            ->text            axis.line        ->line           
 [3] axis.text        ->text            axis.title       ->title          
 [5] axis.ticks       ->line            panel.grid       ->line           
 [7] panel.grid.major ->panel.grid      panel.grid.minor ->panel.grid     
 [9] strip.text       ->text            axis.line.x      ->axis.line      
[11] axis.line.y      ->axis.line       axis.text.x      ->axis.text      
[13] axis.text.y      ->axis.text       axis.ticks.x     ->axis.ticks     
[15] axis.ticks.y     ->axis.ticks      axis.title.x     ->axis.title     
+ ... omitted several edges

DN-B:有向,有节点名称,各节点不同类型的图
attr:表示可选的属性,name表示是否画出图形名称属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值