Graphviz:反转集群内的两个节点位置

Graphviz: Invert two nodes position inside a cluster

我正在尝试反转集群 (cluster_fp) 内的两个节点 (producción & funciones) 的位置。我需要在顶部 producción 和底部 funciones ,而不是在顶部 funciones 和底部 producción 。我怎样才能做到这一点?他们在集群中只是因为我认为这是正确的方法,但可能不是。因为我的名誉,我不能直接post图片,所以我把链接留给i.stack.imgur.com。

代码:

digraph tríada {
  rankdir=LR;
  edge [arrowhead=none];
  label="* socialmente reconocido";
  labeljust=left;

  subgraph cluster_sinonimia_oa {
    style=dashed;
    label="sinonimia obra-texto";

    subgraph cluster_texto {
      style=striped;
      label=texto;

      selección [shape=rect];
    }

    obra [shape=rect, style=striped];
    supuesto [label="supuesto\nexistencial", shape=plain];
  }

  subgraph cluster_autor {
    style=striped;
    label="autor*";
    
    máquinas [shape=hexagon];

    subgraph cluster_fp {
      label="";
      style=invis;

      funciones [label="atribución o\napropiación", shape=plain];
      producción [shape=plain];
    }

    subgraph cluster_sinonimia_nepa {
      style=dashed;
      label="sinonimia nombre-entidad-persona-autor";

      personas [shape=hexagon];
      entidad [shape=rect];
      real [shape=diamond];
      ficticia [shape=diamond];
      nula [shape=diamond];
      denotación [shape=plain];
      nombre [shape=rect];
    }
  }

  {personas máquinas} -> real [arrowhead=normal];
  {real ficticia nula} -> entidad [arrowhead=normal];
  nombre -> funciones -> obra -> supuesto -> selección -> producción -> entidad -> denotación -> nombre;
}

Live on dreampuf.github.io

谢谢!

根据大量实验,问题似乎是 dot 的算法“加权”了多节点边而不是双节点边。
这是一个经过多次编辑的输入文件,可以生成您想要的输出:

digraph tríada {
  rankdir=LR;
  edge [arrowhead=none];
  label="* socialmente reconocido";
  labeljust=left;

  subgraph cluster_autor {
    style=striped;
    label="autor*";

    subgraph cluster_sinonimia_nepa {
      style=dashed;
      label="sinonimia nombre-entidad-persona-autor";

      personas [shape=hexagon];
      entidad [shape=rect];
      real [shape=diamond];
      ficticia [shape=diamond];
      nula [shape=diamond];
      denotación [shape=plain];
      nombre [shape=rect];
      node [label="" shape=point width=.01] 
      // bogus1 & bogus2 are needed to flip/swap/invert the funciones & producción nodes
      bogus1  bogus2
    }
    
    subgraph cluster_fp {
      label="";
      style=invis;
      funciones [label="atribución o\napropiación", shape=plain];
      producción [shape=plain];
    }

    máquinas [shape=hexagon];

    {personas máquinas} -> real [arrowhead=normal];
    {real ficticia nula} -> entidad [arrowhead=normal];
    entidad -> denotación ->  nombre
  }

  subgraph cluster_sinonimia_oa {
    style=dashed;
    label="sinonimia obra-texto";

    subgraph cluster_texto {
      style=striped;
      label=texto;
      selección [shape=rect];
    }
    obra [shape=rect, style=striped];
    supuesto [label="supuesto\nexistencial", shape=plain];
  }

  nombre -> funciones -> obra -> supuesto -> selección

  producción -> selección  
  entidad -> bogus1 [headclip=false ]
  bogus1 -> bogus2 [tailclip=false, headclip=false]
  bogus2 -> producción [tailclip=false]
}

(是的,大部分编辑都是不必要的)