Through the use of BASH scripts, I am pinging 50+ devices on a computer network, and tracking when these devices fail. Using sed and some other utilities, when a ping fails to return, it is recorded in a CSV file, and processed 3 times a day.
The CSV file is in the format, such as Input data (CSV)
6 92121
3 93237
2 93828
2 95409
4 95439
3 101045
3 102515
2 105211
where we see the amount of failures first, followed by the time, with the : marks stripped out. This causes GNUPlot to see "time" as a whole integer.
When the above range is plotted, we see the following (clipped for focus):
Looking at the chart, I think that the + marks should be shifted a bit further to the right, as they don't appear to be aligning where I think they should. 4 minor ticks in from 80000 would be 90000, and two more ticks to the right would be 95000. My next data point is at 95409 which I would expect to be closer to 100000 than how it appears.
Perhaps this is a mind-game because I am plotting time which is based on 60 units, to a graph that is based on units of ten. HH:MM:SS format. 100000 is 10:00:00 and while 10:50:27 exists (105027 to GNUPlot), we won't see 10:75:13 (107513) because of the time rollover @ 60 min. I wonder if GNUPlot can be told X axis is time oriented in that fashion...
The second question is how to explicitly tell GNUPlot to label every X tick, reducing the interpreted guess of the X values.
Here is my GNUPlot command:
gnuplot <<-EOFMarker
set datafile separator ','
set title "Devices failing pings at given time - Graph Created: UTC "
set xlabel 'Time in HH:MM:SS -- 6am run missing leading zero'
set ylabel 'Amount of Sites with Dropped Pings'
set yrange [1:75]
set grid
set key off
set xtics rotate
set mxtics 8
set terminal png size 4000,700
set output '/BigPing/Reports/${reporttime}-${checkhour}-sites-time.png'
plot '/mnt/ram/graph-input.dat' using 2:1
EOFMarker
Originally I had lines connecting the + points to increase readability, but the graph didn't return to Zero like I though it would when we didn't have data present.
I was expecting more xtick labels so the gaps would not be so large.
Actually, I'm bound to use gnuplot 4.6.2
Of course, gnuplot can plot time data (check help timecolumn
and help time_specifiers
), however, your time data format is a bit unfortunate. For example, gnuplot will have difficulties to decide whether 12345
will be 1h 23 m 45 s
or 12 h 34 m 5 s
. Hence you have to make sure that the number has 6 digits, i.e. with leading zero. You can force this via sprintf("%06d",...)
.
Then you can easily decode this time with the specifier string "%H%M%S"
.
Script: (works for gnuplot>=5.0.0, Jan. 2015)
### plot special time format
reset session
$Data <<EOD
6 92121
3 93237
2 93828
2 95409
4 95439
3 101045
3 102515
2 105211
EOD
t(col) = strptime("%H%M%S", sprintf("%06d",column(col)))
set format x "%H:%M" timedate
set offset graph 0.05, 0.05, 0.05, 0.05
set grid x,y
set key noautotitle
plot $Data u (t(2)):1 w p pt 7 lc "red"
### end of script
Result:
Addition: version for gnuplot>=4.6.0, output same as graph above.
Data: SO78770582.dat
6 92121
3 93237
2 93828
2 95409
4 95439
3 101045
3 102515
2 105211
Script: (works at least for gnuplot>=4.6.0, March 2012)
### plot special time format
reset
FILE = "SO78770582.dat"
t(col) = strptime("%H%M%S", sprintf("%06d",column(col)))
set xdata time
set format x "%H:%M"
set offset graph 0.05, 0.05, 0.05, 0.05
set grid x,y
set key noautotitle
plot FILE u (t(2)):1 w p pt 7 lc rgb "red"
### end of script