如何在Gnuplot中绘制带有加权边的树/图/网?

时间:2017-02-24 20:26:59

标签: graph tree gnuplot

我正在这里讨论的gnuplot中绘制一棵树(How to plot tree/graph/web data on gnuplot?)。但是,我想包括树的边缘权重,即对于每个边缘,我有一个代表边缘权重的数字(例如10,20,30,40)。下图以红色显示我想在gnuplot中绘制的边缘权重(我使用功率点添加了这个)。

有谁能告诉我如何在gnuplot中用重量绘制边缘?

enter image description here

2 个答案:

答案 0 :(得分:1)

我建议你在问题中提到的答案略有不同。让我们假设顶点的坐标存储在文件pnts.dat中,如下所示:

0   5   10
1   20  20
2   15  15
3   30  30
4   40  10

这里,第一列记录相应的标签,第二列和第三列分别包含x和y坐标。

边缘可以在单独的文件edges.dat中定义为:

0   1   30  0   1
1   2   40  0   -2
1   4   20  0   1
1   3   10  0   1

这里,前两列包含点索引(它们指的是pnts.dat的第一列)。第三列记录特定边缘的权重。最后,最后两列包含生成的关联标签的x,y位移。

有了这个,Gnuplot脚本可能看起来像:

set xr [0:50]   
set yr [0:50]

set size square   

flePnts = 'pnts.dat'
fleEdges = 'edges.dat'

loadEdges = sprintf('< gawk '' \
    FNR==NR{x[$1]=$2;y[$1]=$3;next;} \
    {printf "%%f\t%%f\n%%f\t%%f\n\n", x[$1], y[$1], x[$2], y[$2];} \
'' %s %s', flePnts, fleEdges); 

loadWeights = sprintf('< gawk '' \
    FNR==NR{x[$1]=$2;y[$1]=$3;next;} \
    {printf "%%f\t%%f\t%%s\n", (x[$1]+x[$2])/2 + $4, (y[$1]+y[$2])/2 + $5, $3} \
'' %s %s', flePnts, fleEdges);

plot \
    loadEdges using 1:2 with lines lc rgb "black" lw 2 notitle, \
    flePnts using 2:3:(0.6) with circles fill solid lc rgb "black" notitle, \
    flePnts using 2:3:1 with labels tc rgb "white" font "Arial Bold" notitle, \
    loadWeights using 1:2:3 with labels tc rgb "red" center font "Arial Bold" notitle
  1. loadEdges命令调用gawk以便为所有边生成相应的x / y坐标对(由空行分隔)
  2. loadWeights为每个边缘计算中间点并在这些坐标处放置标签(考虑所需的偏移量)
  3. 最后,获得: enter image description here

答案 1 :(得分:0)

另外,如果要向边缘添加箭头,则必须执行以下步骤:

  1. 添加箭头样式:

    set style arrow 1 head filled size screen 0.025,10,40 lc rgb "black" lw 2
    
  2. 使用向量 更改命令行

    loadEdges using 1:2:3:4 with vectors arrowstyle 1  notitle, \
    
  3. 下图显示了最终结果:

    enter image description here

    这是最终的代码:

        set xr [0:50]
        set yr [0:50]
    
        set size square
    
        set style arrow 1 head filled size screen 0.025,10,40 lc rgb "black" lw 2
    
        flePnts = 'pnts.dat'
        fleEdges = 'edges.dat'
    
        loadEdges = sprintf('< gawk '' \
            FNR==NR{x[$1]=$2;y[$1]=$3;next;} \
            {printf "%%f\t%%f\t%%f\t%%f\n\n", x[$1], y[$1], (x[$2]-x[$1]), (y[$2]-y[$1]);} \
        '' %s %s', flePnts, fleEdges);
    
        loadWeights = sprintf('< gawk '' \
            FNR==NR{x[$1]=$2;y[$1]=$3;next;} \
            {printf "%%f\t%%f\t%%s\n", (x[$1]+x[$2])/2 + $4, (y[$1]+y[$2])/2 + $5, $3} \
        '' %s %s', flePnts, fleEdges);
    
        plot \
            loadEdges using 1:2:3:4 with vectors arrowstyle 1  notitle, \
            flePnts using 2:3:(0.6) with circles fill solid lc rgb "black" notitle, \
            flePnts using 2:3:1 with labels tc rgb "white" font "Arial Bold" notitle, \
            loadWeights using 1:2:3 with labels tc rgb "red" center font "Arial Bold" notitle