Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gnuplot: Histogram plots with inline data

Gnuplot 4.6.5

I wanted to plot a histogram plot.

I tried the demo here: http://gnuplot.sourceforge.net/demo/histograms.2.gnu with a separate datefile: https://dl.dropboxusercontent.com/u/45318932/immigration.dat . And it worked:

enter image description here

However, when I tried to put the separate data file as inline data into the script file:

# set terminal pngcairo  transparent enhanced font "arial,10" fontscale 1.0 size 500, 350 
# set output 'histograms.2.png'
set boxwidth 0.9 absolute
set style fill   solid 1.00 border lt -1
set key inside right top vertical Right noreverse noenhanced autotitles nobox
set style histogram clustered gap 1 title  offset character 0, 0, 0
set datafile missing '-'
set style data histograms
set xtics border in scale 0,0 nomirror rotate by -45  offset character 0, 0, 0 autojustify
set xtics  norangelimit font ",8"
set xtics   ()
set title "US immigration from Northern Europe\nPlot selected data columns as histogram of clustered boxes" 
set yrange [ 0.00000 : 300000. ] noreverse nowriteback
i = 22
plot '-' using 6:xtic(1) ti col, '' u 12 ti col, '' u 13 ti col, '' u 14 ti col
# IMMIGRATION BY REGION AND SELECTED COUNTRY OF LAST RESIDENCE
#
Region  Austria Hungary Belgium Czechoslovakia  Denmark France  Germany Greece  Ireland Italy   Netherlands Norway  Sweden  Poland  Portugal    Romania Soviet_Union    Spain   Switzerland United_Kingdom  Yugoslavia  Other_Europe    TOTAL   
1891-1900   234081  181288  18167   -   50231   30770   505152  15979   388416  651893  26758   95015   226266  96720   27508   12750   505290  8731    31179   271538  -   282 3378014 
1901-1910   668209  808511  41635   -   65285   73379   341498  167519  339065  2045877 48262   190505  249534  -   69149   53008   1597306 27935   34922   525950  -   39945   7387494 
1911-1920   453649  442693  33746   3426    41983   61897   143945  184201  146181  1109524 43718   66395   95074   4813    89732   13311   921201  68611   23091   341408  1888    31400   4321887 
1921-1930   32868   30680   15846   102194  32430   49610   412202  51084   211234  455315  26948   68531   97249   227734  29994   67646   61742   28958   29676   339570  49064   42619   2463194 
1931-1940   3563    7861    4817    14393   2559    12623   144058  9119    10973   68028   7150    4740    3960    17026   3329    3871    1370    3258    5512    31572   5835    11949   377566  
1941-1950   24860   3469    12189   8347    5393    38809   226578  8973    19789   57661   14860   10100   10665   7571    7423    1076    571 2898    10547   139306  1576    8486    621147  
1951-1960   67106   36637   18575   918 10984   51121   477765  47608   43362   185491  52277   22935   21697   9985    19588   1039    671 7894    17675   202824  8225    16350   1325727 
1961-1970   20621   5401    9192    3273    9201    45237   190796  85969   32966   214111  30606   15484   17116   53539   76065   3531    2465    44659   18453   213822  20381   11604   1124492 
e

Here is the modified script: https://dl.dropboxusercontent.com/u/45318932/histograms.plt

Now it does work properly, only showing the result for Denmark:

enter image description here

There are three lines of the same warnings in the Gnuplot terminal:

 "C:\Documents and Settings\leoking\My Documents\temp\histograms.plt", line 27: warning: Skipping data file with no valid points

It is really important to be able to use the inline data for me. Helps would be much appreciated.

like image 344
Changwang Zhang Avatar asked Jul 31 '14 10:07

Changwang Zhang


2 Answers

The problem is that when you use plot '-', the data up until the e is consumed and can't be used again. When you use '' in subsequent plots on the same line, it's just shorthand for the name of the previous file descriptor. It doesn't mean reuse what has already been read, it means read it again.

A really lousy way of making it work, which proves the point I've made above, is by simply having four copies of the data in a row in your script.

Slightly better would be to at least trim the data down to the parts you're interested in. Note the change in column; each one is now using 2:

plot '-' using 2:xtic(1) ti col, '' u 2 ti col, '' u 2 ti col, '' u 2 ti col
# IMMIGRATION BY REGION AND SELECTED COUNTRY OF LAST RESIDENCE
#
Region Denmark
1891-1900 50231
1901-1910 65285
1911-1920 41983
1921-1930 32430
1931-1940 2559
1941-1950 5393
1951-1960 10984
1961-1970 9201
e
Region Netherlands
1891-1900 26758
1901-1910 48262
1911-1920 43718
1921-1930 26948
1931-1940 7150
1941-1950 14860
1951-1960 52277
1961-1970 30606
e 
Region Norway
1891-1900 95015
1901-1910 190505
1911-1920 66395
1921-1930 68531
1931-1940 4740
1941-1950 10100
1951-1960 22935
1961-1970 15484
e  
Region Sweden
1891-1900 226266
1901-1910 249534
1911-1920 95074
1921-1930 97249
1931-1940 3960
1941-1950 10665
1951-1960 21697
1961-1970 17116
e
like image 169
Tom Fenech Avatar answered Oct 15 '22 01:10

Tom Fenech


Just to give another peek to the upcoming version 5.0: There you can define reuseable, internal data blocks as follows:

$data <<EOF
1 2 3
2 3 4
3 4 5
EOF
plot $data using 1:2, '' using 1:3
like image 22
Christoph Avatar answered Oct 15 '22 01:10

Christoph