Gnuplot,饼图,左侧放置标签,无法全部看到

时间:2016-05-01 14:58:26

标签: charts gnuplot

我需要使用Gnuplot制作一些饼图。我使用了我在这里找到的代码。我的数据文件如下所示:

Województwo Suma
Dolnośląskie    3.6 
Kujawsko-Pomorskie  7.5
Lubelskie   4.7
Lubuskie    3.3
Łódzkie 8.1
Małopolskie 6.9 
Mazowieckie 12.5
Opolskie    2.6
Podkarpackie    6    
Podlaskie   3.4
Pomorskie   8
Śląskie 14

我的Gnuplot脚本:

#!/usr/bin/gnuplot

set encoding utf8 
set datafile separator "\t"
set termoption enhanced

set terminal epscairo enhanced color dashed rounded size 8.5, 5.5
set output '2008-2015procent_pie.eps'

stats '2008-2015procent_pie.csv' u 2 noout      # get STATS_sum (sum of column 2)

ang(x)=x*360.0/STATS_sum        # get angle (grades)
perc(x)=x*100.0/STATS_sum       # get percentage

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

unset border            # remove axis
unset tics                # remove tics on axis
unset colorbox            # remove palette colorbox 
unset key                 # remove titles

Ai = 0.0; Bi = 0.0;             # init angle
mid = 0.0;                      # mid angle
i = 0; j = 0;                   # color
yi  = 0.0; yi2 = 0.0;           # label position

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

plot for [i=1:STATS_records] '2008-2015procent_pie.csv' u (0):(0):(1):(Ai):(Ai=Ai+ang($2)):(i) every ::i::i with circle linecolor palette,\
     '2008-2015procent_pie.csv' u (mid=(Ai+ang($2)), Ai=2*mid-Ai, mid=mid*pi/360.0, -0.5*cos(mid)):(-0.5*sin(mid)):(sprintf('%.1f\%', $2, perc($2))) ever\
y ::1 w labels center font ',10',\
     for [i=1:STATS_records] '2008-2015procent_pie.csv' u (1.45):(i*0.25):1 every ::i::i with labels left,\
     for [i=1:STATS_records] '+' u (1.3):(i*0.25):(i) pt 5 ps 4 lc palette

我对此脚本有2个问题:

  1. 我没有看到所有标签,是否有可能以某种方式移动标签,我可以看到它们全部?
  2. 颜色:在这里,在我的饼图上我基本上只有2种颜色 - 黄色和蓝色。如何制作这样我可以有各种颜色,不同颜色的不同价值?
  3. 我的图表现在看起来像这样:

    enter image description here

    谢谢。

    -------------------------------------------- -------------------------------------------------- - - - - - - - - - - - - - - - - - - -编辑 -------------------------------------------------- -------------------------------------------------- -------------------------------

    我改变了一些我的脚本,正如@RolandSmith建议的那样,我修改了一点我的数据文件,现在看起来像这样:

    Województwo Suma
    Dolnośląskie    3.6 
    Kujawsko-Pomorskie  7.5
    Lubelskie   4.7
    Lubuskie    3.3
    Łódzkie 8.1
    Małopolskie 6.9 
    Mazowieckie 12.5
    Opolskie    2.6
    Podkarpackie    6    
    Podlaskie   3.4
    Pomorskie   8
    Śląskie 14
    Świętokrzyskie  2.8  
    Warmińsko-Mazurskie 4    
    Wielkopolskie   7.9
    Zachodniopomorskie  4.6
    

    修改后的脚本:

    #!/usr/bin/gnuplot
    
    set encoding utf8 
    set datafile separator "\t"
    set termoption enhanced
    
    set terminal epscairo enhanced color dashed rounded size 8.5, 5.5
    set output '2008-2015procent_pie.eps'
    
    stats '2008-2015procent_pie.csv' u 2 noout      # get STATS_sum (sum of column 2)
    
    ang(x)=x*360.0/STATS_sum        # get angle (grades)
    perc(x)=x*100.0/STATS_sum       # get percentage
    
    set size square                 # square canvas
    set xrange [-1:1.5]
    set yrange [-1.25:1.25]
    set style fill solid 1
    
    unset border            # remove axis
    unset tics                # remove tics on axis
    unset colorbox            # remove palette colorbox 
    unset key                 # remove titles
    
    Ai = 0.0; Bi = 0.0;             # init angle
    mid = 0.0;                      # mid angle
    i = 0; j = 0;                   # color
    yi  = 0.0; yi2 = 0.0;           # label position
    
    set palette rgb 33,13,10;
    
    plot for [i=1:STATS_records] '2008-2015procent_pie.csv' u (0):(0):(1):(Ai):(Ai=Ai+ang($2)):(i) every ::i::i with circle linecolor palette,\
         '2008-2015procent_pie.csv' u (mid=(Ai+ang($2)), Ai=2*mid-Ai, mid=mid*pi/360.0, -0.5*cos(mid)):(-0.5*sin(mid)):(sprintf('%.1f\%', $2, perc($2))) every ::1 w labels center font ',10',\
         for [i=1:STATS_records] '2008-2015procent_pie.csv' u (1.45):(i*0.25)-1.9:1 every ::i::i with labels left,\
         for [i=1:STATS_records] '+' u (1.3):(i*0.25)-1.9:(i) pt 5 ps 4 lc palette
    

    现在问题在于标签 - 我仍然无法看到所有标签。从CSV文件中可以看到应该有16个标签。我试图改变页面大小,没有成功。谢谢你的帮助。

    当前派:

    enter image description here

1 个答案:

答案 0 :(得分:2)

  1. 要向内或向外移动饼图中的标签,请更改sincos前面的“-0.5”。要移动标签和颜色方块,请在第三个和第四个图中将(i*0.25)更改为(i*0.25)-1.2

    更新:将(i*0.25)更改为例如(i*0.18)使标签之间的距离变小。并将ps 4更改为例如ps 3使广场变小。

  2. 定义一个更大的苍白。您当前的只有两个条目。获得一个颜色至少与您有条目的颜色。您可以使用colorbrewer生成调色板颜色。

  3. 其他一些观点。

    • 虽然这非常聪明,但你可能正在推动gnuplot 方式超出预期。考虑使用其他工具,例如Python's matplotlib

    • 您的数据最多不超过100,但只能达到80.6。因此,您应该使用angperc函数正确缩放图形。我不能把手指放在上面,但看起来不对。

    • sprintf中,您应该只使用百分比:sprintf('%.1f\%', perc($2))