Gnuplot, точки линий + гистограмма, один график, два файла данных - PullRequest
0 голосов
/ 14 сентября 2018

Чтение в руководстве по gnuplot не помогло мне в этом, и мои поиски в Интернете также не были плодотворными. Я использую gnuplot 5.2 patchlevel 0

Я строю следующий график с данными из файла плюс добавленное вычисленное скользящее среднее (код ниже) Graph with moving average Используемый файл это, graph.dat:

20180607-1200 20.4
20180611-1200 23.2
20180617-1200 22.1

Я бы хотел добавить гистограмму внизу графика на основе другого файла с такими же значениями x, histogram.dat:

20180607-1200 18.95
20180611-1200 18.52
20180617-1200 18.76

и я попробовал следующий код:

set terminal png size 640,396
set border front lw 1

# Make left y-axis ticks and numbers disappear
set ytics scale 0
set ytics textcolor rgb "white"

set y2tics
set y2range [18.5:25.7]

set output 'graph.png'

set xdata time
set timefmt "%Y%m%d-%H%M"
set xtics timedate
set xtics format "%Y-%m-%d"
set xtics rotate
set mxtics 7
# A week is 604800 seconds
set xtics "20180607-1200",604800,"20180617-1200"
set offsets graph 0.015, graph 0.015, 0, 0

# For moving average
samples(x) = $0 > 4 ? 5 : ($0+1)
avg5(x) = (shift5(x), (back1+back2+back3+back4+back5)/samples($0))
shift5(x) = (back5=back4, back4=back3, back3=back2, back2=back1, back1=x)

# Initialize the running sum
init(x) = (back1 = back2 = back3 = back4 = back5 = sum = 0)

# Plot data, running average, and histogram
plot sum = init(0), \
"graph.dat" using 1:2 axes x1y2 title "graph" with linespoints, \
'' using 1:(avg5($2)) axes x1y2 title "moving average" with linespoints, \
"histogram.dat" using 1:2 axes x1y2 title "histogram" with histogram clustered

но после добавления последней строки (начиная с "histogram.dat") возвращается следующее сообщение об ошибке:

plot sum = init(0), "graph.dat" using 1:2 axes x1y2 title "graph" with linespoints, '' using 1:(avg5($2)) axes x1y2 title "moving average" with linespoints, "histogram.dat" using 1:2 axes x1y2 title "histogram" with histogram clustered
                                                                                                                                                                                                                                  ^
"grapher.gp", line 35: Too many columns in using specification

чего я не понимаю. Я стремлюсь к графику с маленькой гистограммой внизу, как в этом построенном примере: Constructed example Вопрос: Что я делаю не так? Как я могу сделать linespoints и histogram на основе двух разных файлов, показанных на одном графике? [С тех пор я узнал, что для этого нужно использовать boxes вместо histogram - см. Мой собственный ответ ниже]

Бонусный вопрос: Есть ли лучший способ избежать показа чисел оси y1, лучше, чем мой хак просто сделать их белыми?

1 Ответ

0 голосов
/ 16 сентября 2018

Никто до сих пор не ответил, и пока что мне удалось решить первую проблему, поэтому я поделюсь ею здесь, на случай, если она кому-нибудь поможет. Я слышал, что переполнение стека побуждает нас отвечать на наши вопросы в подобных случаях.

Чтобы это работало, я использовал комбинацию из следующих методов:

http://psy.swansea.ac.uk/staff/carter/gnuplot/gnuplot_time_histograms.htm

и изучение руководства по gnuplot 5.2, а также множество советов по всему Интернету. Вот результирующий график:

Graph

А вот код, который создал график. Это немного долго, поэтому может потребоваться прокрутка:

set output 'graph.png'
set terminal png size 640,396
set origin 0, 0.25             # Origin for graph+margins. (Screen coordinates)
set size 1, 0.75               # X/Y scaling of size of graph+labels+margins
set rmargin at screen 580.0/640   # Distance from border to canvas right edge
set bmargin at screen 120.0/396   # Distance from border to canvas bottom edge

set border front lw 1

# Make left y-axis ticks and numbers disappear (Is there a better way?)
set ytics scale 0
set ytics textcolor rgb "white"

set y2tics               # Put tics and numbers on rightmost y-axis
set y2range [18.5:25.7]  # Range for rightmost y-axis

set xdata time
set timefmt "%Y%m%d-%H%M"
set xtics timedate
set xtics format "%Y-%m-%d"
set xtics rotate
set mxtics 7
# One week is 604800 seconds
set xtics "20180607-1200",604800,"20180617-1200"

# Distance between border and the plotted data. Left, right, top, bottom.
# 1/4 day is 21600 seconds
set offsets 21600, 21600, 0, 0

# For moving average
samples(x) = $0 > 4 ? 5 : ($0+1)
avg5(x) = (shift5(x), (back1+back2+back3+back4+back5)/samples($0))
shift5(x) = (back5=back4, back4=back3, back3=back2, back2=back1, back1=x)

# For initializing the running sum
init(x) = (back1 = back2 = back3 = back4 = back5 = sum = 0)


set multiplot

    # Plot data and running average
    plot sum = init(0), \
    "graph.dat" using 1:2 axes x1y2 title "graph" with linespoints, \
    '' using 1:(avg5($2)) axes x1y2 title "moving average" with linespoints


    # Prepare for the histogram
    unset key      # No key/legend for the histogram
    unset xtics    # Avoid "doubled" labels on the x-axis
    unset y2tics   # Avoid "doubled" labels on the y2-axis
    unset border   # No need to draw the border twice

    # 1/8 day is 10800 seconds
    set boxwidth 10800 absolute
    set style fill solid
    # Distance between border and the plotted data. Left, right, top, bottom.
    # First plot's left/right offsets minus boxwidth is 10800
    set offsets 10800, 10800, 0, 0

    # Plot histogram
    plot "histogram.dat" using 1:2 with boxes lc rgb "#383880" axes x1y2

unset multiplot

Я не совсем уверен, в чем суть соотношений, в командах rmargin и bmargin. Было несколько проб и ошибок.

Если кто-то может объяснить это или у вас есть ответ на «бонусный вопрос» в моем оригинальном сообщении, пожалуйста, не стесняйтесь.

...