0

I am trying to plot the frequency count of the following values available in (test_plot_bins.txt) in Gnuplot

-0.355534673
0.13217762
-0.842048585
-0.131302223
0.03265043
0.190827265
-0.25680709
-0.072149448
-0.156086803
0.065009468
-0.003330263
-0.059023393
-0.017556788
-0.06090761
-0.205948548
-0.18360047

using this script

#!/usr/bin/gnuplot -persist

    
clear
reset
set key off
set border 3

set boxwidth 0.05 absolute

set style fill solid 1.0 noborder      
    
  
bin_width = 0.01;
bin_number(x) = floor(x/bin_width)
rounded(x) = bin_width * ( bin_number(x) + 0.5 )
  

plot 'test_plot_bins.txt' using (rounded($1)) :(1) smooth frequency with boxes

Here is the result. How do I change it that it becomes a normal line plot?

Plot1

Secondly, when I replicate a value so that its count becomes 2 and then plot it, it stands out and diminishes other values. Here is how it looks like

Plot2

How do I scale the plot that other values with count of 1 are also visible?

3
  • Your title and problem description don't match. You're drawing a histogram essentially, which there is a build-in style already. Commented Jul 16, 2020 at 22:11
  • @karakfa I don't know how to draw line and I used histogram so I can at least visualize how the data looks like Commented Jul 16, 2020 at 22:34
  • 1
    set style data lines Commented Jul 17, 2020 at 5:25

1 Answer 1

3

To get a line plot you can replace with boxes by with lines. However this is probably not the best way to display this sort of binned data. I suggest using the on-line demo bins.demas a guide. I copy it here for reference.

#
# Demo illustrating the relationship between
# a binned histogram and a kernel density model of the same data.
#
$DATA << EOD
1   1
2   1
8   1
9   1
17  1
17  1
9   1
9   1
5   1
7   1
7   1
8   1
8   1
8   1
10  1
11  1
11  1
12  1
14  1
3   1
3   1
3   1
8   7
15  1
17  1
17  1
18  1
19  1
20  1
EOD

set title "Comparison of a binned histogram and\na kernel density model of the same data"

set style data lines
set xtics 1 norangelimit nomirror
set grid y
set yrange [0:5.5]
set style fill solid 0.5 noborder
set jitter spread 0.5

plot $DATA using 1 bins=20 with boxes title '20 bins', \
        '' using 1:(1) smooth kdensity bandwidth .5 lw 2 title 'smooth kdensity', \
        '' using 1:(.9) with impulse lc "black" title 'jittered data'

enter image description here

Notes:

  • bins=20 will automatically divide the data into 20 equal-width bins along x. There is an optional keyword binrange but if no binrange is given, the range is taken from the extremes of the x values found in the data.

  • The set jitter command adds a small displacement to points, or in this case impulses, that would otherwise lie exactly on top of each other. It has no effect on the boxes or lines.

  • smooth kdensity is one of many options for producing a smooth line. For full documentation see the gnuplot documentation. It generates a function f(x) in which each point in the data set acts as the center of a Gaussian weighted by distance from x; the resulting curve is the sum of these contributions. Selecting a bandwidth smaller than the spacing between points insures that each local maximum gets its own peak.

  • Each of the three representations, boxes, lines, and impulses could be plotted independently. This plot combines all three modes for comparison.

Sign up to request clarification or add additional context in comments.

1 Comment

could you comment the code. It could be hard to understand for someone from Matlab background

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.