ggraph / ggplot2中的手动图例[R]

时间:2018-07-29 14:38:34

标签: r ggplot2 ggraph

除了this post以外,我在这里提出新的问题,如何调整由ggraph构建的图例。

以下是生成当前图的脚本:

    ## Packages
    library(igraph)
    library(tidygraph)
    library(ggraph)
    library(ggplot2)
    library(tidyverse)

    ## Edge and node
    edge <- data.frame(from=c(0,0,0,0,1,2,3),
                       to=c(0,1,2,3,0,0,0),
                       weight=c(1,3,1,1,3,1,1))
    node <- data.frame(id=c(0,1,2,3),
                       p=c(9,1,0,0),
                       w=c(0,2,0,0),
                       s=c(0,1,1,1),
                       size=c(9,3,1,1),
                       gr=c(0,1,1,2))

    ## Load data frames as tbl_graph class
    edge <- edge %>% mutate(from=from+1,to=to+1)
    net <- tbl_graph(nodes=node,edges=edge,directed=TRUE)

    ## Set arrows
    ar <- arrow(angle=30,length=unit(5,"mm"),ends="last",type="closed")
    ## Plot
    ggraph(net,layout="graphopt") +
    ## Edges
    geom_edge_link(aes(start_cap=circle(log(node1.size)+2,unit="native"),
                       end_cap=circle(log(node2.size)+2,unit="native"),
                       width=weight,label=weight),
        position="identity",angle_calc="along",force_flip=TRUE,
        label_dodge=unit(4.0,"mm"),label_push=unit(-0.4,"mm")) +
        ## Width scale
        scale_edge_width(range=c(0.4,4),breaks=c(1:10),name="Movements\nbetween zones") +
    ## Add arrows separately
    geom_edge_link(arrow=ar,aes(start_cap=circle(log(node1.size)+1,unit="native"),
        end_cap=circle(log(node2.size)+1,unit="native"))) +
    ## Nodes
        ## Plot location id
        geom_node_label(aes(label=id,hjust=log(size+6),vjust=log(size+6)),repel=TRUE,
                        label.padding=unit(0.8,"mm"),label.r=unit(0.0,"mm"),label.size=0.1,size=3.5) +
        ## Circle
        geom_node_circle(aes(r=log(size)+1),color="black",fill="white",size=0.4) +
        ## Plot work activity
        geom_node_text(aes(size=w,hjust=log(w)+0.4),label="w",color="red",
                       position="identity",vjust=0.4,fontface="bold") +
        ## Plot school activity
        geom_node_text(aes(size=s,hjust=-log(s)-0.2),label="s",color="blue",
                       position="identity",vjust=0.4,fontface="bold") +
        ## Size scale
        scale_size(range=c(0,5),breaks=c(1:100),name="Numberof\nActivities",
                   guide=guide_legend(override.aes=list(label="a",color="black"))) +
        # scale_color() +
    ## Theme
    theme_graph() + coord_fixed()

这是我想要的结果。

enter image description here

这是上述脚本的结果。

enter image description here

有两个与图例有关的问题可以达到我想要的结果:

  • 如何用其他字体替换“活动数量”中重叠的“ w”和“ s”,如预期结果所示以黑色显示“ a”(活动)?
  • 如何添加显示在所需结果中的另一个手动图例“活动类型”?

尽管它是用ggraph编写的,但我认为语法似乎与ggplot2中的语法相似。感谢您的建议!

==========更新=========

第一个问题已通过更改scale_size参数来解决,如更新的脚本所示。

但是,第二个问题仍然存在,我在圆心处的0-value符号上发现了另一个问题(非常小的点)。我发现了一些解决方案,可以通过以下方式解决此问题:1)subset()0-value的数据帧中省略data=subset(df,x!=0)记录,2)仅在data=ifelse(x==0,NA,.)中用NA填充0值方法,但是由于它是从graph对象编写的,因此在这种情况下,可能无法直接使用。

===========更新版本2 =========

这确实很棘手,但我可以通过某种方式删除线条中心的点并添加一个图例。

我确实不确定原因,但是通过以下方法解决了前一个问题:1)将0 values数据框中的node替换为NA,2)替换{ geom_node_text中的{1}}语句为NA,然后3)用aes(size=...)指定颜色。它不会删除数据,而只是将aes(size=ifelse(is.na(w),0,w) ...的颜色更改为白色以使其不可见。

我想这不是正式的解决方案,而只是我在数十次试验中遇到的方式。有趣的是1)和2)应该结合使用,否则会返回错误。

这是最终更新:

color=ifelse(w==0,"white","red")

enter image description here

但是,由于它仍然是丑陋的代码,因此我仍在等待您提出有关更适当操作的建议。

0 个答案:

没有答案