有没有人在 gnuplot 中有饼图的示例代码?我找不到任何很好的例子,它有一个简单的图形和它周围的文本,其中带有 % 符号,可以轻松显示每个部分有多少圆圈。
一些示例数据:
Management frames 4596
Control frames 70173
Data frames 40347
TCP packets 36864
HTTP packets 525
ICMP packets 47
Total frames 115116
下面的代码与我上面引用的链接有点不同。
left
或right
取决于它们相对于 的位置0
。@Labels
只需插入Labels
之前为几行定义的文本。这应该会使绘图命令更短一些,并希望减少混乱。您可以选择饼图的起始角度PieStart
和“旋转”方向PieDirection
您可以为线段和标签添加单独的 x,y 偏移量
如您所见,原始数据中不需要总和。总金额将自动计算。
我希望您可以根据自己的需要调整此代码。
关于标签定位的一些解释:根据标签的位置是在圆的右半(LabelPosX>=0
)还是左半(LabelPosX<0
),对齐将分别是left
和right
。使用绘图样式,with labels
您可以指定标签的对齐方式,但是,显然不是作为变量,因为 gnuplotwith
仅在绘图命令结束时评估表达式,而不是在每个数据点期间。这就是为什么它需要两个命令来分别绘制左对齐和右对齐标签。如果有更简单的方法,请告诉我。
代码:
### pie-chart with labels with gnuplot
reset session
set size square
set angle degree
unset colorbox
set border 0
unset tics
unset key
$Data <<EOD
# item value color SegmentOffsetX SegmentOffsetY LabelOffsetX LabelOffsetY
"Abc zyx" 85843 red 0 0 0 0
"Def wvu" 44000 green 0 -0.2 0 -0.2
"Ghi tsr" 25399 blue 0 0 0 0
"Jkl qpo" 18451 magenta 0 0 0 0
"Mno nml" 12344 yellow 0 0 0 0
"Pqr kji" 11999 cyan 0 0 0 0
"Stu hgf" 9000 orange 0 0 0 0
"Vwx edc" 8500 olive 0 0 0 0
"Yz ba" 4711 violet 0 0 0.05 0.05
EOD
# define a palette from colornames of the datafile/datablock in column 3
MyPalette = '('
set table $Dummy
plot $Data u (MyPalette = MyPalette.sprintf('%d "%s", ',$0+1,strcol(3)),0) with table
unset table
MyPalette = MyPalette[:strlen(MyPalette)-2].')'
set palette defined @MyPalette
stats $Data u 2 nooutput # get total sum from column 2
TotalSum = STATS_sum
set xrange[-1.5:1.5]
set yrange[-1.5:1.5]
Radius = 1.0
RadiusLabels = 1.05
PieStart = 90 # 0 = 3 o'clock, 90 = 12 o'clock
PieDirection = -1 # -1 clockwise, 1 counterclockwise
LabelPosX(n,dx) = RadiusLabels*cos(PieDirection*(2*Sum+n)/TotalSum*180.+PieStart)+dx
LabelPosY(n,dy) = RadiusLabels*sin(PieDirection*(2*Sum+n)/TotalSum*180.+PieStart)+dy
Sum = PieDirection==1 ? 0 : TotalSum
Angle1(n) = (PieDirection==1 ? Sum/TotalSum*360 : (Sum=Sum-n, Sum/TotalSum*360)) + PieStart
Angle2(n) = (Sum=Sum+n, Sum/TotalSum*360) + (Sum=Sum-n, PieStart)
Labels = 'LabelPosX($2,$6):NaN): (LabelPosY($2,$7)): \
(Sum=Sum+$2,sprintf("%s %.1f%%", strcol(1), $2/TotalSum*100)) with labels font ",12"'
plot $Data u (0+$4):(0+$5):(Radius):(Angle1($2)):(Angle2($2)):($0) \
with circles fs solid 1.0 lc palette notitle,\
'' u (LabelPosX($2,$4)>=0 ? @Labels left, \
'' u (LabelPosX($2,$4)<0 ? @Labels right
### end of code
结果:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句