使用gnuplot绘制流程树(更改节点颜色和形状)
我对前一段时间提出的一个关于如何画一棵树的问题做出了极好的回答。我一直在尝试根据数据中的附加列更改某些节点的颜色和形状。对于上下文,另一个问题中构建层次树图形的特定代码如下所示: 代码 带有gnuplot的树图 重置会话 #ID父名称使用gnuplot绘制流程树(更改节点颜色和形状),gnuplot,Gnuplot,我对前一段时间提出的一个关于如何画一棵树的问题做出了极好的回答。我一直在尝试根据数据中的附加列更改某些节点的颜色和形状。对于上下文,另一个问题中构建层次树图形的特定代码如下所示: 代码 带有gnuplot的树图 重置会话 #ID父名称 $Data颜色和形状都可以在数组中编码。数组必须与预期的最大索引值一样大。这里我使用上面显示的数据和两个长度为4的数组,它们分别编码[圆,圆,方,方]和[黄,绿,黄,绿] # put datablock into strings IDs = Parents = N
$Data颜色和形状都可以在数组中编码。数组必须与预期的最大索引值一样大。这里我使用上面显示的数据和两个长度为4的数组,它们分别编码[圆,圆,方,方]和[黄,绿,黄,绿]
# put datablock into strings
IDs = Parents = Names = Shapes = ''
set table $Dummy
plot $Data u (IDs = IDs.strcol(1).' '): \
(Parents = Parents.strcol(2).' '): \
(Names = Names.strcol(3).' '): \
(Shapes = Shapes.strcol(4).' ') w table
unset table
# Top node has no parent ID 'NaN'
Start(n) = int(sum [i=1:words(Parents)] (word(Parents,i) eq 'NaN' ? int(word(IDs,i)) : 0))
# get list index by ID
ItemIdx(s,n) = n == n ? (tmp=NaN, sum [i=1:words(s)] ((word(s,i)) == n ? (tmp=i,0) : 0), tmp) : NaN
# get parent of ID n
Parent(n) = word(Parents,ItemIdx(IDs,n))
# get level of ID n, recursive function
Level(n) = n == n ? Parent(n)>0 ? Level(Parent(n))-1 : 0 : NaN
# get number of children of ID n
ChildCount(n) = int(sum [i=1:words(Parents)] (word(Parents,i)==n))
# Create child list of ID n
ChildList(n) = (Ch = ' ', sum [i=1:words(IDs)] (word(Parents,i)==n ? (Ch = Ch.word(IDs,i).' ',1) : (Ch,0) ), Ch )
# m-th child of ID n
Child(n,m) = word(ChildList(n),m)
# List of leaves, recursive function
LeafList(n) = (LL='', ChildCount(n)==0 ? LL=LL.n.' ' : sum [i=1:ChildCount(n)] (LL=LL.LeafList(Child(n,i)), 0),LL)
# create list of all leaves
LeafAll = LeafList(Start(0))
# get x-position of ID n, recursive function
XPos(n) = ChildCount(n) == 0 ? ItemIdx(LeafAll,n) : (sum [i=1:ChildCount(n)] (XPos(Child(n,i))))/(ChildCount(n))
# create the tree datablock for plotting
set print $Tree
do for [j=1:words(IDs)] {
n = int(word(IDs,j))
print sprintf("% 3d % 7.2f % 4d % 5s % 2s", n, XPos(n), Level(n), word(Names,j), word(Shapes,j))
}
set print
print $Tree
# get x and y distance from ID n to its parent
dx(n) = XPos(Parent(int(n))) - XPos(int(n))
dy(n) = Level(Parent(int(n))) - Level(int(n))
unset border
unset tics
set offsets 0.25, 0.25, 0.25, 0.25
array shape[4] = [ 6, 6, 4, 4 ] # pointtype 6 = circle, pointtype 4 = square
array color[4] = [ 0xeeee00, 0xccffcc, 0xeeee00, 0xccffcc ]
plot $Tree u 2:3:(dx($1)):(dy($1)) w vec nohead ls -1 not,\
'' u 2:3:(shape[$5]+1):(color[$5]) w p pt variable ps 6 lc rgb variable not, \
'' u 2:3:(shape[$5]) w p pt variable ps 6 lw 1.5 lc rgb "black" not, \
'' u 2:3:4 w labels offset 0,0.1 center not
### end of code
颜色和形状都可以在数组中编码。数组必须与预期的最大索引值一样大。这里我使用上面显示的数据和两个长度为4的数组,它们分别编码[圆,圆,方,方]和[黄,绿,黄,绿]
# put datablock into strings
IDs = Parents = Names = Shapes = ''
set table $Dummy
plot $Data u (IDs = IDs.strcol(1).' '): \
(Parents = Parents.strcol(2).' '): \
(Names = Names.strcol(3).' '): \
(Shapes = Shapes.strcol(4).' ') w table
unset table
# Top node has no parent ID 'NaN'
Start(n) = int(sum [i=1:words(Parents)] (word(Parents,i) eq 'NaN' ? int(word(IDs,i)) : 0))
# get list index by ID
ItemIdx(s,n) = n == n ? (tmp=NaN, sum [i=1:words(s)] ((word(s,i)) == n ? (tmp=i,0) : 0), tmp) : NaN
# get parent of ID n
Parent(n) = word(Parents,ItemIdx(IDs,n))
# get level of ID n, recursive function
Level(n) = n == n ? Parent(n)>0 ? Level(Parent(n))-1 : 0 : NaN
# get number of children of ID n
ChildCount(n) = int(sum [i=1:words(Parents)] (word(Parents,i)==n))
# Create child list of ID n
ChildList(n) = (Ch = ' ', sum [i=1:words(IDs)] (word(Parents,i)==n ? (Ch = Ch.word(IDs,i).' ',1) : (Ch,0) ), Ch )
# m-th child of ID n
Child(n,m) = word(ChildList(n),m)
# List of leaves, recursive function
LeafList(n) = (LL='', ChildCount(n)==0 ? LL=LL.n.' ' : sum [i=1:ChildCount(n)] (LL=LL.LeafList(Child(n,i)), 0),LL)
# create list of all leaves
LeafAll = LeafList(Start(0))
# get x-position of ID n, recursive function
XPos(n) = ChildCount(n) == 0 ? ItemIdx(LeafAll,n) : (sum [i=1:ChildCount(n)] (XPos(Child(n,i))))/(ChildCount(n))
# create the tree datablock for plotting
set print $Tree
do for [j=1:words(IDs)] {
n = int(word(IDs,j))
print sprintf("% 3d % 7.2f % 4d % 5s % 2s", n, XPos(n), Level(n), word(Names,j), word(Shapes,j))
}
set print
print $Tree
# get x and y distance from ID n to its parent
dx(n) = XPos(Parent(int(n))) - XPos(int(n))
dy(n) = Level(Parent(int(n))) - Level(int(n))
unset border
unset tics
set offsets 0.25, 0.25, 0.25, 0.25
array shape[4] = [ 6, 6, 4, 4 ] # pointtype 6 = circle, pointtype 4 = square
array color[4] = [ 0xeeee00, 0xccffcc, 0xeeee00, 0xccffcc ]
plot $Tree u 2:3:(dx($1)):(dy($1)) w vec nohead ls -1 not,\
'' u 2:3:(shape[$5]+1):(color[$5]) w p pt variable ps 6 lc rgb variable not, \
'' u 2:3:(shape[$5]) w p pt variable ps 6 lw 1.5 lc rgb "black" not, \
'' u 2:3:4 w labels offset 0,0.1 center not
### end of code
# put datablock into strings
IDs = Parents = Names = Shapes = ''
set table $Dummy
plot $Data u (IDs = IDs.strcol(1).' '): \
(Parents = Parents.strcol(2).' '): \
(Names = Names.strcol(3).' '): \
(Shapes = Shapes.strcol(4).' ') w table
unset table
# Top node has no parent ID 'NaN'
Start(n) = int(sum [i=1:words(Parents)] (word(Parents,i) eq 'NaN' ? int(word(IDs,i)) : 0))
# get list index by ID
ItemIdx(s,n) = n == n ? (tmp=NaN, sum [i=1:words(s)] ((word(s,i)) == n ? (tmp=i,0) : 0), tmp) : NaN
# get parent of ID n
Parent(n) = word(Parents,ItemIdx(IDs,n))
# get level of ID n, recursive function
Level(n) = n == n ? Parent(n)>0 ? Level(Parent(n))-1 : 0 : NaN
# get number of children of ID n
ChildCount(n) = int(sum [i=1:words(Parents)] (word(Parents,i)==n))
# Create child list of ID n
ChildList(n) = (Ch = ' ', sum [i=1:words(IDs)] (word(Parents,i)==n ? (Ch = Ch.word(IDs,i).' ',1) : (Ch,0) ), Ch )
# m-th child of ID n
Child(n,m) = word(ChildList(n),m)
# List of leaves, recursive function
LeafList(n) = (LL='', ChildCount(n)==0 ? LL=LL.n.' ' : sum [i=1:ChildCount(n)] (LL=LL.LeafList(Child(n,i)), 0),LL)
# create list of all leaves
LeafAll = LeafList(Start(0))
# get x-position of ID n, recursive function
XPos(n) = ChildCount(n) == 0 ? ItemIdx(LeafAll,n) : (sum [i=1:ChildCount(n)] (XPos(Child(n,i))))/(ChildCount(n))
# create the tree datablock for plotting
set print $Tree
do for [j=1:words(IDs)] {
n = int(word(IDs,j))
print sprintf("% 3d % 7.2f % 4d % 5s % 2s", n, XPos(n), Level(n), word(Names,j), word(Shapes,j))
}
set print
print $Tree
# get x and y distance from ID n to its parent
dx(n) = XPos(Parent(int(n))) - XPos(int(n))
dy(n) = Level(Parent(int(n))) - Level(int(n))
unset border
unset tics
set offsets 0.25, 0.25, 0.25, 0.25
array shape[4] = [ 6, 6, 4, 4 ] # pointtype 6 = circle, pointtype 4 = square
array color[4] = [ 0xeeee00, 0xccffcc, 0xeeee00, 0xccffcc ]
plot $Tree u 2:3:(dx($1)):(dy($1)) w vec nohead ls -1 not,\
'' u 2:3:(shape[$5]+1):(color[$5]) w p pt variable ps 6 lc rgb variable not, \
'' u 2:3:(shape[$5]) w p pt variable ps 6 lw 1.5 lc rgb "black" not, \
'' u 2:3:4 w labels offset 0,0.1 center not
### end of code