2014-11-22 2 views
1

Я пытаюсь сделать следующее в gnuplot: цвет с градиентом эллипса. Каждая точка эллипса имеет Z-значение, заданное с помощью функцииГрадиентная цветная полярная кривая

charge_density(t,beta) = -sin(t)*beta*(sqrt(1-(beta**2)))/(1-((sin(t)*beta)**2)) 

Функции радиуса эллипса задаются аналогичной функцией:

radius(t,beta) = sqrt(1-(beta**2))/sqrt(1-((sin(t)*beta)**2)) 

Где beta является только параметром, удовлетворяющим 0<beta<1 , а t - угол.

Ну, я попытался использовать специальный файл "+" с опцией lc rgb variable, но он не работает с полярными координатами.

Я также пробовал set mapping cylindrical, но ничего не произошло.

Возможно ли это только с декартовыми координатами? В этом случае мне нужно будет сделать 2 графика и изменить вышеуказанные функции ...

Или мне нужно создать файл данных с данными angle, radius, z?

Я хотел бы сделать это с pm3d и следующим palette:

set palette model RGB defined (-1 "blue", 0 "black", 1 "red") 

ответ

3

вот код:

beta =0.5 
charge_density(t,beta) = -sin(t)*beta*(sqrt(1-(sin(t)*beta)**2))/(1-((sin(t)*beta)**2)) 
radius(t,beta) = sin(t*beta) # your function equals 1! 

# convert polar to carthesian 
r_x(t)=radius(t,beta)*cos(t) 
r_y(t)=radius(t,beta)*sin(t) 


set palette model RGB defined (-1 "blue", 0 "black", 1 "red") 

set size ratio -1 # same unit length in x and y 

# number of sample points. 
# increase if curve has edges 
set samples 100 

#decouple range of "+" and xrange 
set parametric 

plot [0:3*pi] "+" u (r_x($1)):(r_y($1)):(charge_density($1,beta))\ 
    with lines linewidth 3 linecolor palette 

и есть результат:

enter image description here

ПРИМЕЧАНИЕ: Ваш radius равен 1, поэтому я взял еще одну функцию. Кроме того, у вашего charge_density есть одна дополнительная закрывающая скобка.

Некоторые комментарии:

  • если участок с lc rgb variable, значение цвета RGB 24bit ожидается:

    (red*256^2 + green*256 + blue) с red, green, blue = 0...255

    Если вы хотите GNUPLOT использовать цвет в соответствии с палитры, пишут lc palette

  • gnuplot 4.6 не делает поддержка "+" для полярных. Кроме того, mapping задает поведение для 3D-графиков. Однако, поскольку ваша формула вычисляет радиус для угла, вы можете легко преобразовать это в картографические координаты и построить их. Существует еще один недостаток: диапазон, заданный в plot, также устанавливает xrange. Это также означает, что «длина» вашей кривой изменяется при изменении xrange. Вы можете решить это с помощью set parametric, что заставляет gnuplot использовать специальную переменную u вместо x при построении функций. Приятно (и помогает), что это влияет на специальный файл "+". Я не знаю, является ли это (положительная) ошибка или функция.

+0

Sweber, я исправил функции. Спасибо за консультацию! – Larara

+0

Это было именно то, что мне нужно! Только одно: хотя я использовал «set parameter», именно «set xrange» и «set yrange» работали для изменения диапазонов, а не 'set urange' и' set vrange'. – Larara

+0

Дело в том, что скрипт может содержать 'set xrange [-1: 1]'. Затем '' + "' также идет от -1 до 1. Таким образом, ваш параметр зависит от xrange, чего вы здесь не хотите. Если вы используете 'plot [0: 3 * pi]" + "...', то xrange будет автоматически установлен на [0: 9.4], переопределив команду 'set xrange'. Но с «параметрическим» это не так. И да, «set urange» здесь не действует. Как сказано, это немного странно. – sweber

Смежные вопросы