Graphviz 人体解剖结构及其功能关系图

Graphviz 人体解剖结构及其功能关系图,graphviz,Graphviz,我是一名一年级医学生,我想用Graphviz创建一个易于解释的人体解剖结构及其功能关系图。特别是,我想创建一个图表,包括大约50块肌肉、50条神经、50条动脉、80块骨骼和骨突,肌肉附着在骨突上的近端和远端点,哪些神经支配哪些肌肉,哪些动脉灌注哪些肌肉,等等 对于表示所有这些结构及其关系的全面图像(我知道这将非常复杂),我认为图形可能是表示这些结构及其功能关系的最佳方式,Graphviz似乎是制作此类图形的良好软件,但是连接结构的边有不同的类型。例如,严格根据大体结构的宏观观察,腋神经似乎来自臂

我是一名一年级医学生,我想用Graphviz创建一个易于解释的人体解剖结构及其功能关系图。特别是,我想创建一个图表,包括大约50块肌肉、50条神经、50条动脉、80块骨骼和骨突,肌肉附着在骨突上的近端和远端点,哪些神经支配哪些肌肉,哪些动脉灌注哪些肌肉,等等

对于表示所有这些结构及其关系的全面图像(我知道这将非常复杂),我认为图形可能是表示这些结构及其功能关系的最佳方式,Graphviz似乎是制作此类图形的良好软件,但是连接结构的边有不同的类型。例如,严格根据大体结构的宏观观察,腋神经似乎来自臂丛神经(BP)的后索,其中包含来自BP上、中、下干的纤维,这三条主干包含来自前支的神经纤维,这些前支起源于脊髓神经C5、C6、C7、C8和T1。然而,尽管有外观,腋神经的电连通性是这样的,它实际上只包含起源于脊神经C5和C6的前支的神经纤维(见图片,我应该在这里解释,所有脊神经的所有神经纤维在实际大体解剖中都是相同的颜色,所以试着想象没有颜色的图像,以了解物理连接与电连接的区别,如颜色所示)因此,为了准确地表示腋神经及其衍生的所有上游神经纤维的物理连接和电连接,我需要至少两种不同类型的边缘:“物理”边缘和“电”边缘我认为Graphviz可以做到这一点,但我对使用Graphviz还不熟悉,不确定实现这一点的最佳方法(尽管这不是我这里的主要问题)

我还需要找到一种表示关系的方法,如上图所示,其中神经纤维通过多个结构到达这些结构下游的命名神经。例如,在上图中,颜色用于显示源自C6(蓝色)的一组连续神经纤维并蜿蜒至以下所有结构:“神经至锁骨下”、“上干”、“外侧索”、“正中神经”、“胸外侧神经”、“腋神经”和“桡神经”

我试着用Graphviz表示其中的一些,如下图所示

这是我用几行点语言代码创建的,如下所示(这是一个不完整的代码片段;不是我用来创建该图像的整个点文件):

但这种表示法的主要问题是C6和臂丛上干之间有多条蓝色边缘,C5和臂丛上干之间有多条黄色边缘,C7和臂丛中干之间有多条橙色边缘,臂丛上干之间有多条橙色边缘臂丛中干和臂丛外侧索

我知道为什么会有与上面段落中相同颜色的多个边。我在点文件中显式地创建了它们。为了使逻辑正确(我可能最终用python或其他东西解析这个点文件),我确实希望点文件包含相同颜色的多条边。但我不希望看到渲染图像中相同颜色的多条边

所以我的主要问题是:如何让Graphviz抑制C6和上(上)主干之间5条蓝色边的渲染,并将它们渲染为1条蓝色边

第二个问题是:如何强制Graphviz渲染不同颜色的边,使它们不会相互重叠,从而使每个不同颜色的边在整个范围内(从原始节点到相邻节点)保持不同?这是上图中的一个问题的最佳示例,可以在两个示例中看到(蓝色和黄色)连接鞋面的边缘(高级)后跟的躯干。虽然蓝色和黄色的边缘在两个节点的附近是明显的,但是在它们的跨度中间,它们重叠得非常彻底,很难看到有两个边缘;蓝色几乎完全遮住了黄色。我想找到一个通用的方法来迫使GlavVIZ制作蓝色和黄色的边缘。s完全不重叠(我不想在视觉上检查图像并更正点文件,而是想找到某种方法告诉Graphviz不允许边缘重叠,除非它们可能是相同的颜色)

之前的Graphviz图片开始说明为什么这个问题对我来说很重要,但经过更长时间的研究,下面的图片显示得更好。事情变得如此混乱,以至于很难解释

@Simon感谢您(在下面的评论中)解释关于OS X上GNU
head
head
的行为不同,因此我使用了您的
sed
脚本,这消除了我的第一个问题。但是,我认为您的
removeDupEdge
脚本可能会导致我的
.gv
文件出现其他问题

为了演示,我将从您的示例
multiEdge.gv
文件开始

graph {
    node [style=filled];
    a [label="a1",fillcolor=green]
    b [label="b1",fillcolor=purple]
    c [label="c1"]
    d [label="d1"]
    e [label="e1"]

    a -- b -- c[color = blue];
    a -- b -- c -- d[color = red];
    a -- c;
    a -- b -- c -- d -- e[color = blue];
}
您的
removeDupEdge
脚本似乎无法很好地处理上述两行特征:

$ ./removeDupEdge <multiEdge.gv 
graph {
    node [label="\N",
        label=a1];
        label=b1];
        style=filled
    ];
    a    [fillcolor=green,
    a -- b   [color=blue];
    a -- b   [color=red];
    a -- c;
    b    [fillcolor=purple,
    b -- c   [color=blue];
    b -- c   [color=red];
    c    [label=c1];
    c -- d   [color=blue];
    c -- d   [color=red];
    d    [label=d1];
    d -- e   [color=blue];
    e    [label=e1];
}
$。/removeDupEdge(经过大量编辑,使流程对多属性节点和边具有健壮性)

关于第一个问题,显示使用
strict
关键字可以阻止
graphviz
$ ./removeDupEdge <multiEdge.gv 
graph {
    node [label="\N",
        label=a1];
        label=b1];
        style=filled
    ];
    a    [fillcolor=green,
    a -- b   [color=blue];
    a -- b   [color=red];
    a -- c;
    b    [fillcolor=purple,
    b -- c   [color=blue];
    b -- c   [color=red];
    c    [label=c1];
    c -- d   [color=blue];
    c -- d   [color=red];
    d    [label=d1];
    d -- e   [color=blue];
    e    [label=e1];
}
graph {
    node [style=filled];
    a [label="a1",fillcolor=green]
    b [label="b1",fillcolor=purple]
    c [label="c1"]
    d [label="d1"]
    e [label="e1"]

    a -- b -- c[color = blue];
    a -- b -- c -- d[color = red];
    a -- c;
    a -- b -- c -- d -- e[color = blue];
}
#!/bin/sh
neato -Tcanon | perl -p -e 's/,\n/,/' >tmp.tmp
head -3 tmp.tmp >header.tmp
tail -1 tmp.tmp >tail.tmp
tail -n +4 tmp.tmp | sed -n '$ !p' | sort | uniq | cat header.tmp - tail.tmp
$ removeDupEdge <multiEdge.gv
graph {
        node [label="\N",               style=filled
        ];
        a -- b   [color=blue];
        a -- b   [color=red];
        a -- c;
        a        [fillcolor=green,              label=a1];
        b -- c   [color=blue];
        b -- c   [color=red];
        b        [fillcolor=purple,             label=b1];
        c -- d   [color=blue];
        c -- d   [color=red];
        c        [label=c1];
        d -- e   [color=blue];
        d        [label=d1];
        e        [label=e1];
}
$ removeDupEdge <multiEdge.gv | neato -Tpng -omultiEdge.png