Центрирование меток на круговой диаграмме - PullRequest
0 голосов
/ 04 декабря 2018

Я подписан на этот пост , чтобы создать круговую диаграмму с использованием Gnuplot.Единственная проблема с этим подходом заключается в том, что я не могу выровнять свои процентные метки.Что мне здесь не хватает?

ФАЙЛ ДАННЫХ:

"Others"        1.085117e-01    3.904323e-02
"D_o"           2.894902e-01    6.145359e-01
"{/Symbol b}_o" 5.760601e-01    3.760299e-01
"O_h"           5.393108e-01    1.000000e+00
"D_p"           6.743313e-01    2.284404e-01
"{/Symbol a}_p" 1.000000e+00    1.271822e-01
"{/Symbol b}_f" 4.020115e-01    2.233656e-01
"D_m"           2.389996e-01    8.577689e-02
"{/Symbol a}_m" 3.601146e-01    1.033153e-01
"{/Symbol b}_m" 5.596836e-01    1.947165e-01

КОД:

#!/usr/bin/gnuplot

# Terminal & Encoding
set terminal epscairo enhanced color dashed rounded size 8.5, 4.5
set output 'mu_piechart.eps'
set termoption enhanced
set encoding utf8 

# Get Status
filename = './datafile.dat'
stats filename u 2 noout

# Get Angles & Percentages
ANG(x)=x*360.0/STATS_sum
PER(x)=x*100.0/STATS_sum

# Square Canvas
set size square
set xrange [-1:1.5]
set yrange [-1.25:1.25]
set style fill solid 1

# Remove Base Properties (Titles, Tics, Axis, Palette)
unset key
unset tics
unset border
unset colorbox

# Initial Angle, Mid Angle, Initial Color
A = 0.0; M = 0.0; i = 0;

# Palette
set palette defined (1 1 0.788 0.055, 2 0.090 0.161 0.659) 

# Plot
plot for [i=0:STATS_records-1] filename u (0):(0):(1):(A):(A=A+ANG($2)):(i) every ::i::i with circle linecolor palette,\
     filename u (M=A+ANG($2), A=2*M-A, M=M*pi/360.0, -0.5*cos(M)):(-0.5*sin(M)):(PER($2) > 8.00 ? sprintf('%.1f\%', PER($2)) : " ") every ::1 w labels center font ',10',\
     for [i=0:STATS_records-1] filename u (1.45):(i*0.25)-1.11:($1) every ::i::i with labels left,\
     for [i=0:STATS_records-1] '+' u (1.3):(i*0.25)-1.11:(i) pt 5 ps 4 lc palette

exit

ВЫХОД:

Неправильные позиции в процентах на рисунке, сгенерированном скриптом.

Wrong position for the percentages.

1 Ответ

0 голосов
/ 04 декабря 2018

Ваши ярлыки находятся в неправильных позициях, потому что ваш label график начинается с 1, то есть вы пропускаете первую запись.Кроме того, я не понимаю, почему вы рисуете круговые части против часовой стрелки, а метки - по часовой стрелке.

Вот рабочая версия вашего сценария, без некоторых частей, которые являются лишними для демонстрации.Обе метки и части круговой диаграммы строятся, начиная с угла A = 0 (обратите внимание на вторую инициализацию между двумя графиками):

reset

# Get Status
filename = './datafile.dat'
stats filename u 2 noout

# Get Angles & Percentages
ANG(x)=x*360.0/STATS_sum
PER(x)=x*100.0/STATS_sum

# Y position of key point and label
YLBL(row) = 2.0 * (row - 0.5*(STATS_records - 1))/(STATS_records - 1)

# Square Canvas
set size square
set xrange [-1:1.5]
set yrange [-1.25:1.25]
set style fill solid 1

# Remove Base Properties (Titles, Tics, Axis, Palette)
unset key
unset tics
unset border
unset colorbox

# Palette
set palette defined (1 1 0.788 0.055, 2 0.090 0.161 0.659) 

# Plot
A = 0.0
plot filename u (0):(0):(1):(A):(A=A+ANG($2)):0 with circle linecolor palette,\
     A = 0,\
     filename u (M=A+ANG($2), A=2*M-A, M=M*pi/360.0, 0.5*cos(M)):(0.5*sin(M)):(PER($2) > 8.0 ? sprintf('%.1f\%', PER($2)) : "" ) w labels center,\
     filename u (1.3):(YLBL($0)):1 with labels offset char 3 left ,\
     filename u (1.3):(YLBL($0)):0 pt 5 ps 4 lc palette

Сценарий содержит некоторые другие улучшения:

  • Вам не нужно перебирать STATS_records
  • Текст и точка для ключа нанесены на одну и ту же позицию, метка смещается с параметром offset на три символьных единицы (offset char 3).Это упрощает настройку.

enter image description here

...