• R语言已解决
  • 使用DiagrammeR中的grViz函数绘图时,怎样针对不同的线设置不同的splines参数

如题,想让“分税制改革”分别到“财政集权”和“体制改革”之间的线设置 splines = ortho,即轴对齐的折角线,然而设置了似乎不起作用。问了 AI,也没得到好用的答案。请坛友们帮忙瞅瞅。代码如下:

library(DiagrammeR)

grViz(diagram = "digraph{
# 定义图形布局,从左至右
graph[rankdir = LR]
# 定义节点       
  node[shape = rectangle, style = dashed]
    A1[label = '财政包干:中央财政困难+\n国家财政困难']
    A2[label = '地方财政增长\n方式转变:工\n商业税收与\n土地财政', width = 1.5]
    
  node[shape = rectangle,style = filled, fillcolor = 'gray', color = 'white', width = 2]
    B1[label = '分税制改革']
    B2[label = '土地和要素\n市场改革']
    B3[label = '五个统筹']
    B4[label = '农村税费改革']
    B5[label = '乡财县管,\n省直管县']
    B6[label = '转移支付改革']    
    
  node[shape = rectangle, style = solid, color = 'black', width = 1]
    C1[label = '财政\n集权']
    C4[label = '体制\n改革']
    C2[label = '国税、地税分立', width = 2]
    C3[label = '税收向中央集中', width = 2]
    C5[label = '支出分权', width = 2]
    C6[label = '转移支付体系', width = 2]
    C7[label = '总体均衡', width = 1.5]
    C8[label = '县乡财政危机\n(纵向失衡)', width = 1.5]
    C9[label = '地区间失衡\n(横向失衡)', width = 1.5]  
    C10[label='城市化大\n兴土木']
    C11[label='招商引资']
    C12[label='重生产\n轻民生']
    C13[label='农民负担']  
    
# 定义第一个子图
subgraph cluster1{
  label = '央地博弈:\n讨价还价'
  style = solid
  color = white
  A2; C7; C8; C9
} 
# 定义第二个子图
subgraph cluster2{
  label = '社会现象'
  style = solid
  color = white
  C10; C11; C12; C13
}
# 定义第三个子图
subgraph cluster3{
  label = '继续改革'
  style = solid
  color = white
  B2; B3; B4; B5; B6
}
# 定义第四个子图,隐形线,调换 C1和 C4的位置
subgraph cluster4{
  rankdir = TB
  rank = same
  C1 -> C4[style = invis]
}

# 定义线
edge[arrowsize = 1, samehead = h1, sametail = t1]
A1 -> B1; 
C1 -> {C2, C3}; C4 -> {C5, C6}
{C3, C5} -> A2; 
C6 -> {C7, C8, C9}
A2 -> {C10, C11, C12, C13}
C8 -> {C13, B5, B6}; C9 -> B6
C10 -> {B2, B3}; C12 -> B3; C13 -> {B3, B4}
edge[headport = 'w', tailport = 'w', splines = ortho, constraint = false]
B1 -> {C1, C4}
# 设置多个节点,维持在一个垂直线上
{rank = same; A1; B1; C1; C4;}
}")
    yuanfan 更改标题为「使用DiagrammeR中的grViz函数绘图时,怎样针对不同的线设置不同的splines参数

    yuanfan 从上到下,怎么样?

    grViz(diagram = "digraph{
    # 定义图形布局,从左至右
    graph[rankdir = TB]
    # 定义节点       
      node[shape = rectangle, style = dashed]
        A1[label = '财政包干:中央财政困难+\n国家财政困难']
        A2[label = '地方财政增长\n方式转变:工\n商业税收与\n土地财政', width = 1.5]
        
      node[shape = rectangle,style = filled, fillcolor = 'gray', color = 'white', width = 2]
        B1[label = '分税制改革']
        B2[label = '土地和要素\n市场改革']
        B3[label = '五个统筹']
        B4[label = '农村税费改革']
        B5[label = '乡财县管,\n省直管县']
        B6[label = '转移支付改革']    
        
      node[shape = rectangle, style = solid, color = 'black', width = 1]
        C1[label = '财政\n集权']
        C4[label = '体制\n改革']
        C2[label = '国税、地税分立', width = 2]
        C3[label = '税收向中央集中', width = 2]
        C5[label = '支出分权', width = 2]
        C6[label = '转移支付体系', width = 2]
        C7[label = '总体均衡', width = 1.5]
        C8[label = '县乡财政危机\n(纵向失衡)', width = 1.5]
        C9[label = '地区间失衡\n(横向失衡)', width = 1.5]  
        C10[label='城市化大\n兴土木']
        C11[label='招商引资']
        C12[label='重生产\n轻民生']
        C13[label='农民负担']  
        
    # 定义第一个子图
    subgraph cluster1{
      label = '央地博弈:\n讨价还价'
      style = solid
      color = white
      A2; C7; C8; C9
    } 
    # 定义第二个子图
    subgraph cluster2{
      label = '社会现象'
      style = solid
      color = white
      C10; C11; C12; C13
    }
    # 定义第三个子图
    subgraph cluster3{
      label = '继续改革'
      style = solid
      color = white
      B2; B3; B4; B5; B6
    }
    # 定义第四个子图,隐形线,调换 C1和 C4的位置
    subgraph cluster4{
      rankdir = TB
      rank = same
      C1 -> C4[style = invis]
    }
    
    # 定义线
    edge[arrowsize = 1, samehead = h1, sametail = t1]
    A1 -> B1; 
    B1 -> {C1, C4}
    C1 -> {C2, C3}; C4 -> {C5, C6}
    {C3, C5} -> A2; 
    C6 -> {C7, C8, C9}
    A2 -> {C10, C11, C12, C13}
    C8 -> {C13, B5, B6}; C9 -> B6
    C10 -> {B2, B3}; C12 -> B3; C13 -> {B3, B4}
    edge[headport = 'w', tailport = 'w', splines = ortho, constraint = false]
    # 设置多个节点,维持在一个垂直线上
    {rank = same; A1; B1; C1; C4;}
    }")

    示意图也可以考虑 Drawio 这个软件

      yuanfan 我看到了你的博文使用 DiagrammeR 绘制流程图的笔记的最后两个示例,才知道你想要的输出是下面这样。

      目标输出

      像这种图,最便捷的方式是用 Drawio 来画,这种图一点可重复性的需求(复用)都没有,所以完全没必要用代码来画。

      说点题外话,第一次运行上面你给的代码,我还以为是你在梳理这个架构体系,心里暗自赞叹不已。再说点题内话,给主站投稿哇。

        Cloud2016

        这种图一点可重复性的需求(复用)都没有,所以完全没必要用代码来画。

        是的,我也是这么想的。不过我复现那两个图纯粹是因为刚学了点基础知识,菜鸟技痒,试着在实践一下这样才更了解那个工具。后来我弄明白了,在 Graphiz 里,splines 这个参数是一个定义全局属性的参数,不能单独用来定义某一部分线,所以我的问题暂时没法得到答案。

        你推荐的工具我保存了,以后应该会用得着的,谢谢。

        如果要给主站投稿的话,我不懂撒技术,只能写一写数据分析类文章,就算想写……最近我越来越发现,学术圈子好像有壁,像我这样不在学术圈子搬砖的平民想要找文章看找数据都很不方便,有很多文章连 DOI 都找不出来,更不用说上scihub 搜了。另外,作为编辑大人,你一定会要求数据来源绝对权威,不过我最近看完的一本书,名为《置身事内》,里面用于支撑作者观点的数据有不少来源于别人的论文、第三方数据库。话要说完要花很久,先就此打住

          yuanfan 作为编辑大人,你一定会要求数据来源绝对权威

          说明数据来源就好,数据质量没法过多强求,看菜下饭。所谓的权威才真的是璧。