Построение пересекающихся линий в GNUplot - PullRequest
0 голосов
/ 24 марта 2019

Мне не удалось найти ни одного примера того, что я пытаюсь сделать в GNUplot, взламывая документы и демонстрации.

По сути, я хочу построить синие, зеленые и красные линии, которые я нарисовал вручную на этом выходе (для демонстрации) на отметках 10/50/90%.

РЕДАКТИРОВАТЬ : Для ясности я собираюсь определить, где линии распределения ударили совокупное распределение при 0,1 / 0,5 / 0,9, чтобы узнать, какие координаты для рисования линий в. Спасибо!

set terminal png size 1600,800 font "Consolas" 16
set output "test.png"

set title "PDF and CDF - 1000 Simulations"
set grid y2
set ylabel "Date Probability"

set y2range [0:1.00]
set y2tics 0.1
set y2label "Cumulative Distribution"

set xtics rotate by 90 offset 0,-5

set bmargin 6

plot "data.txt" using 1:3:xtic(2) notitle with boxes axes x1y1,'' using 1:4 notitle with linespoints axes x1y2 

enter image description here

Ответы [ 2 ]

1 голос
/ 24 марта 2019

В зависимости от количества точек в вашей совокупной кривой данных может потребоваться интерполяция.Следующий пример выбран таким образом, чтобы ни одна исходная точка данных не была на ваших уровнях 10%, 50%, 90%.Если ваши данные не будут постоянно увеличиваться, они примут последнее значение, соответствующее вашему уровню (уровням).Процедура выглядит следующим образом:

  1. выводит ваши данные в фиктивную таблицу.
  2. проверяет, когда Level находится между последовательными значениями y (y0, y1).
  3. помните интерполированное значение x в xp.
  4. рисовать стрелки от границ графика до точки (xp,Level) (или вместо этого использовать частично внешний прямоугольник «трюк» из@Итан).

Код:

### linear interpolation of data
reset session
set colorsequence classic
set key left

# create some dummy data
set sample 10
set table $Data
    plot [-2:2] '+' u 1:(norm(x)) with table
unset table

Interpolate(yi) = x0 + (x1-x0)*(yi-y0)/(y1-y0)

Levels = "0.1 0.5 0.9"
do for [i=1:words(Levels)] {
    Level = word(Levels,i)
    x0 = x1 = y0 = y1 = NaN
    set table $Dummy
        plot $Data u (x0=x1,x1=$1,y0=y1,y1=$2, (y0<=Level && Level<=y1)? (xp=Interpolate(Level)):NaN ): (Level) w table
    unset table
    set arrow i*2   from xp, graph 0 to xp,Level nohead lc i
    set arrow i*2+1 from xp,Level to graph 1,Level nohead lc i
}

plot $Data u 1:2 w lp pt 7 lc 0 t "Original data"
### end code

Результат:

enter image description here

1 голос
/ 24 марта 2019

Не ясно, спрашиваете ли вы, как найти x-координаты, при которых ваша совокупная линия распределения достигает 0,1, 0,5, 0,9 (сложно сделать, поэтому я пока оставлю это), или спрашиваете, как нарисовать линии один раз Вы знаете эти значения х. Последняя часть проста. Подумайте о линиях, которые вы хотите нарисовать, как незакрепленную часть прямоугольника, которая выходит за пределы графика внизу справа:

set object 1 rectangle from x1, 0.1 to graph 2, -2 fillstyle empty border lc "blue"
set object 2 rectangle from x2, 0.1 to graph 2, -2 fillstyle empty border lc "green"
set object 3 rectangle from x3, 0.1 to graph 2, -2 fillstyle empty border lc "red"
plot ...
...