Круговая диаграмма гнуплот - PullRequest
0 голосов
/ 17 апреля 2019

У кого-нибудь есть пример кода в gnuplot для круговой диаграммы?Я не могу найти какого-либо замечательного примера с простым графиком и текстом вокруг него, а также со знаками%, которые легко показывают, сколько каждой части имеет круг.

Некоторые примеры данных:

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

1 Ответ

2 голосов
/ 02 мая 2019

Следующий код немного отличается от ссылки, на которую я ссылался выше.

  1. вместо предопределенной цветовой последовательности или числовых кодов в отдельном списке, цвета секций задаются в блоке данных (или файле данных) рядом с элементом / номером именами предопределенных цветов в gnuplot (см. Также https://stackoverflow.com/a/55736522/7295599)
  2. метки выровнены left или right в зависимости от их положения относительно 0. @Labels просто вставляет текст, который был определен для Labels несколькими строками ранее. Это должно сделать команду заговора немного короче и, надеюсь, менее запутанной.
  3. вы можете выбрать начальный угол с помощью PieStart и направление вращения на PieDirection круговой диаграммы

  4. Вы можете добавить отдельные смещения x, y для сегментов и меток

Как видите, в исходных данных нет необходимости в общей сумме. Общая сумма будет рассчитана автоматически.

Надеюсь, вы сможете адаптировать этот код под свои нужды.

Некоторые пояснения по размещению этикеток: В зависимости от того, находится ли метка справа (LabelPosX>=0) или слева (LabelPosX<0) на половине круга, выравнивание будет left и right соответственно. Используя стиль печати with labels, вы можете указать выравнивание метки, однако, по-видимому, не как переменную, поскольку gnuplot оценивает выражения после with только один раз в конце команды plot, а не во время каждого назначения данных. Вот почему ему нужны две команды, чтобы отобразить метки с выравниванием по левому краю и по правому краю. Если есть более простой способ, дайте мне знать.

Код:

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

Результат:

enter image description here

...