繁体   English   中英

饼图gnuplot

[英]Pie chart gnuplot

有人在gnuplot中有饼图的示例代码吗? 我找不到一个简单的图形及其周围的文本以及其中带有%符号的示例,该示例可以轻松显示圆的每个部分有多少。

一些示例数据:

Management frames   4596
Control frames  70173
Data frames 40347
TCP packets 36864
HTTP packets    525
ICMP packets    47
Total frames    115116

以下代码与我上面引用的链接有些不同。

  1. 代替在单独的列表中预定义的颜色序列或数字代码,这些部分的颜色在gnuplot中预定义颜色的名称中在项目/编号旁边的数据块(或数据文件)中给出(另请参见https:// stackoverflow .com / a / 55736522/7295599
  2. 标签根据它们相对于0的位置leftright对齐。 @Labels只是在几行之前插入为Labels定义的文本。 这应该使绘图命令更短一些,并希望减少混乱。
  3. 您可以选择由起始角度PieStart和“旋转”方向由PieDirection饼图的

  4. 您可以为细分和标签添加单独的x,y偏移量

如您所见,原始数据中不需要总和。 总和将自动计算。

我希望您可以根据需要调整此代码。

标签位置的一些解释:根据标签的位置是在LabelPosX>=0的右LabelPosX>=0LabelPosX>=0 )还是在左半边( LabelPosX<0 ),对齐方式分别是left对齐和right对齐。 使用打印样式with labels ,你可以指定但是标签的定位,显然不是作为一个变量,因为gnuplot的后计算表达式with只每数据点期间一次在绘图命令的结束,而不是。 这就是为什么它需要两个命令分别绘制左对齐和右对齐标签的原因。 如果有更简单的方法,请告诉我。

码:

### 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

结果:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM