Я хотел бы нарисовать стрелку не с одним цветом, а с цветовым градиентом по его длине. Кто-нибудь знает, как этого добиться? Некоторый псевдокод для создания стрелки, которая начинается красным и заканчивается синим:

set palette defined (0 "red", 1 "blue")
set cbr [0:1]
set arrow from 0,0 to 1,1 linecolor palette cb [0:1] # this doesn't work
2
Eldrad 7 Май 2020 в 14:08

2 ответа

Лучший ответ

Помимо решения @ Friedrich, я хотел бы предложить более общее решение (хотя и более сложное).

Я предполагаю, что вы хотите построить что-то еще, кроме стрелки. В случае, если ваш график должен использовать палитру, я думаю, у вас проблемы, потому что я не уверен, поддерживает ли gnuplot более одной палитры в команде заговора (см. Сплот Gnuplot 5.2: несколько палитр pm3d в одном вызове печати). Таким образом, вы должны самостоятельно реализовать палитру для своей стрелки (см., Например, Gnuplot: прозрачность точек данных при использовании палитры) , Если вы хотите выполнить изогнутые стрелки, используя проверку Кубика Безье (https://stackoverflow.com/a/60389081/7295599) ,

< Сильный > Код:

### arrow with color gradient (besides other palette in plot)
reset session

array A[4] = [-4,-2,4,2]   # arrow coordinates x0,y0,x1,y1
Ax(t) = A[1] + t*(A[3]-A[1])
Ay(t) = A[2] + t*(A[4]-A[2])
AColorStart = 0xff0000   # red
AColorEnd =   0x0000ff   # blue
r(c) = (c & 0xff0000)>>16
g(c) = (c & 0x00ff00)>>8
b(c) = (c & 0x0000ff)
AColor(t) = ((int(r(AColorStart)*(1-t)+r(AColorEnd)*t))<<16) + \
            ((int(g(AColorStart)*(1-t)+g(AColorEnd)*t))<<8)  + \
              int(b(AColorStart)*(1-t)+b(AColorEnd)*t)

array AHead[1]   # dummy array for plotting a single point, here: arrow head
set angle degrees
set style arrow 1 lw 3 lc rgb var size 0.5,15 fixed

set palette grey

plot '++' u 1:2:($1*$2) w image notitle, \
     [0:0.99] '+' u (Ax($1)):(Ay($1)):(AColor($1)) w l lw 3 lc rgb var notitle,\
     AHead u (Ax(0.99)):(Ay(0.99)):(Ax(1)-Ax(0.99)):(Ay(1)-Ay(0.99)):(AColor($1)) w vec as 1 notitle
### end of code

< Сильный > Результат :

enter image description here

2
theozh 8 Май 2020 в 13:59

С line palette можно раскрасить строку. С помощью второй команды можно установить заголовок с помощью set arrow или команды plot vector

set palette defined (0 "red", 1 "blue")
set cbr [0:1]

set arrow 1 from 0.9,0.9 to 1,1 lc "blue"
plot sample [t=0:1] "+" us (t):(t):(t) w l palette

Таким образом, две команды необходимы. Головка стрелки имеет один цвет, который вы должны указать.

2
Friedrich 7 Май 2020 в 19:03