2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Изменение значений полей структуры на примере PLOT [Maple]
Сообщение12.05.2020, 18:29 
Заслуженный участник


12/07/07
4134
Донецк, Украина
Изменение значений полей структуры на примере структуры PLOT.

Допустим, нужно изменить цвет линии, построенной при помощи p:= plot(x^2, x=0..1), на черный. Для получения подструктуры COLOUR в данном случае можно воспользоваться op(2, op(1, p)). И в общем случае можно при помощи op достать цвет / цвета. Но как внести изменения в существующую PLOT-структуру?

Можно (например, для изменения цвета) получить список точек и затем перезаписать p (указав цвет) [работает, по крайней мере, в Maple 15]:
> p:= plot(op(1, op(1, p)), color=black);
Но при таком подходе каждый раз будет нужно находить список точек (для указания параметра op), задающих линии.
Нет ли боле удобных возможностей для работы со структурами в Maple?
В частности, в старых версиях: 7-15 ?

Upd На всякий случай.
Можно конечно сохранить переменную p в текстовый файл.
> save p, "p.txt";
В текстовом редакторе изменит цвет/цвета. И затем прочитать переменную из файла.
> read "p.txt";
Т.е. задача как-то решается. Но хотелось бы более удобным способом: средствами языка Maple.

Upd 2 Получение списка точек без opplottools[getdata].
Можно, конечно без op вытянуть данные и затем по этим данным заново построить график при помощи plot, указав, например, новый цвет. Для рассматриваемого простого примера с графиком $x^2$ и заменой цвета на чёрный
Код:
> p:= plot(x^2, x=0..1, color=blue):
> PlotData:= plottools[getdata](p)[3]:
> Data:= [seq([PlotData[i,1], PlotData[i,2]], i=1..LinearAlgebra[RowDimension](PlotData))]:
> plot(Data, color=black);
В случае нескольких кривых на одном графике тоже проблем особых не будет. Вот пример для трёх кривых
Код:
> p:= plot([x^2, x^3, x^5], x=0..1, color=blue):
> n:= nops([plottools[getdata](p)]):
> PlotData:= [plottools[getdata](p)]:
> PlotData:= [seq(PlotData[k, 3], k=1..n)]:
> Data:= [seq([seq([PlotData[k][i,1], PlotData[k][i,2]], i=1..LinearAlgebra[RowDimension](PlotData[k]))], k=1..n)]:
> p:= plot(Data, color=black);
Можно, конечно, двойные списки не формировать, а данные plot передать в виде матриц
Код:
> p:= plot([x^2, x^3, x^5], x=0..1, color=blue):
> PlotData:= [plottools[getdata](p)]:
> n:= nops([plottools[getdata](p)]):
> PlotData:= [seq(PlotData[k, 3], k=1..n)]:
> plot(PlotData, color=black);

 Профиль  
                  
 
 Re: Изменение значений полей структуры на примере PLOT [Maple]
Сообщение12.05.2020, 22:17 


11/07/16
686
Мне непонятен Ваш вопрос. Почему не применить
Код:
plot(x^2, x=0..1,color=black)
? Результат команды в, скажем так, внутреннем коде Мэйпла получается посредством
Код:
lprint(plot(x^2, x = 0 .. 1, color = black))
...COLOUR(RGB,0.,0.,0.),...
и по этому результату можно восстановить график, применив
Код:
plots:-display(%)

В новых версиях Мэйпла определить кодировку цвета можно такой командой
Код:
ColorTools:-Color("RGB", "Generic Medium Faded Bluish Purple")
<RGB : 0.682 0.212 0.839>

 Профиль  
                  
 
 Re: Изменение значений полей структуры на примере PLOT [Maple]
Сообщение12.05.2020, 22:52 
Заслуженный участник


12/07/07
4134
Донецк, Украина
1. В учебниках и документации, например Bernardin L. et al. “Maple Programming Guide”, 2014, рассказывается о работе с Record, но не о работе со структурами, для примера, типа PLOT, PLOT3D, _PLOTARRAY. С последними структурами сталкиваемся достаточно часто, поэтому они и взяты для примера.

2. Простые графики можно заново перерисовать. Пример графика $x^2$ взят, чтобы проблема понятна была. Более осмысленным будет перерисовка графиков, которые строятся методом plot модуля pdsolve. Потратить много часов на повторный расчёт может быть неразумно. Для оформления рисунков, конечно, можно экспортировать рисунок в ps и уже в текстовом или графическом редакторе отредактировать цвета. Но иногда особым оформлением рисунков заниматься не хочется.

3. Формат результата, который возвращает lprint, несколько неудобен, по крайней мере в старых версиях. Результаты op короче. Для простых графиков разница не особо важна, а для сложных будет заметней. Но это особого значения не имеет. Как-то получить цвета, как я писал выше, можно. (Цвета взяты также для примера, можно что-то другое смотреть.).

Трудность в записи в структуру / в изменении значений отдельных полей структуры.

-- Tue 12.05.2020 22:13:40 --

Код:
> p:= plot(x^2, x=0..1):
> op(p);
CURVES([[0., 0.], [.52576050251256281407035175879397e-2, .27642410600226256912704224640792e-4], [.98322190452261306532663316582915e-2, .96672531353307444256458170248227e-4],

<... выброшена часть списка ....>

[.99513595100502512562814070351760, .99029556098267576734173379460117], [1., 1.]],COLOUR(RGB,1.00000000,0.,0.,_ATTRIBUTE("source" = "mathdefault"))), AXESLABELS(x,""), VIEW(0. .. 1.,DEFAULT,_ATTRIBUTE("source" = "mathdefault"))
Теперь результат, который вернула op, вставляем внутрь PLOT(…) (вместо многоточия), изменяем цвета и присваиваем p. После этого выводим display
Код:
> p:= PLOT(CURVES([[0., 0.], [.52576050251256281407035175879397e-2, .27642410600226256912704224640792e-4],

<... выброшена часть списка ...>

[.99513595100502512562814070351760, .99029556098267576734173379460117], [1., 1.]],COLOUR(RGB,0.00000000,0.,0.,_ATTRIBUTE("source" = "mathdefault"))), AXESLABELS(x,""), VIEW(0. .. 1.,DEFAULT,_ATTRIBUTE("source" = "mathdefault"))):
> display(p);

Если графики сложные, то замучаешься копировать.

-- Tue 12.05.2020 22:28:41 --

(Поэтому в начальном сообщении указан вариант с записью в текстовый файл, редактированием в нём и чтением из него. Это очевидно, но не очень удобно.)

Upd На всякий случай.
При помощи op можно, конечно, разобрать PLOT, изменить нужную часть и затем собрать. Classic Worksheet Maple 15:
Код:
> P:=plot(x^2, x=0..1):
> P1:= op(1, P): P2:= op(2, P): P3 := op(3, P):
> P11:= op(1, P1): P12:=op(2, P1);
    P12:= COLOUR(RGB,1.00000000,0.,0.,_ATTRIBUTE("source" = "mathdefault"))
# Изменяем цвет с красного на черный
> P12:= COLOUR(RGB,0.,0.,0.,_ATTRIBUTE("source" = "mathdefault")):
> P:= PLOT(CURVES(P11, P12), P2, P3):
> display(P);
Но если немного изменить построение графика, то и последовательность «разборки» и «сборки» немного меняется. Classic Worksheet Maple 15:
Код:
> P:=plot(x^2, x=0..1, color=red):
> P1:= op(1, P): P2:= op(2, P); P3:= op(3, P): P4:= op(4, P):
  P2 := COLOUR(RGB,1.00000000,0.,0.)
# Изменяем цвет с красного на черный
> P2 := COLOUR(RGB,0.,0.,0.);
> P:= PLOT(P1, P2, P3, P4):
> display(P);
Вот это и не удобно.

 Профиль  
                  
 
 Re: Изменение значений полей структуры на примере PLOT [Maple]
Сообщение13.05.2020, 06:15 


11/07/16
686
Я так и не понял Ваш вопрос. Во всех графических командах Мэйпла (возможно, за редкими исключениями) имеется опция color для придания цвета графическому объекту. Если Вас интересует внутреннее устройство графики, то компьютерная графика является сложной материей, в которую непрофессионалу углубляться не нужно.

 Профиль  
                  
 
 Re: Изменение значений полей структуры на примере PLOT [Maple]
Сообщение13.05.2020, 08:49 
Заслуженный участник


12/07/07
4134
Донецк, Украина
В частности, вопрос связан со следующим. Построили графики с использованием определённого цвета (по умолчанию или используя опцию color). А потом возникла необходимость изменить цвет. Как бы это, не вычисляя заново данные, сделать?
(При этом сами данные иногда вычисляются одновременно с построением графика. Именно этот случай рассматривается.) [Upd На всякий случай. В новых версиях можно воспользоваться Context Panel. Но вопрос об изменении именно самоuго выражения PLOT.]

Выполнив в Maple 15 или Maple 7
Код:
> p:= plot(x^2, x=0..1, color=blue):
> whattype(p);
    function
видим, что PLOT не является особым типом данных: нужно работать с выражением общего вида (в частности, использовать op, nops и searchtext) или сохранить в [текстовый] файл и там уже быстро искать и изменять нужные места.

В общем, вопрос был о том, есть ли какие-то дополнительные возможности для работы с выражениями типа PLOT. (Если нет, то и возможностями для работы с произвольными выражениями можно обойтись.)

Ещё подробнее сформулировать вопрос не смогу. Я и так уже несколько раз одно и то же написал.

 Профиль  
                  
 
 Re: Изменение значений полей структуры на примере PLOT [Maple]
Сообщение13.05.2020, 11:59 


11/07/16
686
Если я правильно понимаю, требуется изменить цвет графика, не производя вычислений наново. В Мэйпле 2019.1 это можно сделать таким образом:
Код:
a := plot(x^2, x = 0 .. 1):
plots:-display(a, color = "Blue", overrideoptions);

Справки по overrideoptions не нашел. В Мэйпле 16.01 этот код не работает.

 Профиль  
                  
 
 Re: Изменение значений полей структуры на примере PLOT [Maple]
Сообщение13.05.2020, 16:53 
Заслуженный участник


12/07/07
4134
Донецк, Украина
Изменение цвета вроде бы чаще всего бывает нужно, спасибо.
(Указанная Вами возможность уменьшает необходимость в непосредственной работе со структурами типа PLOT,…)

 Профиль  
                  
 
 Re: Изменение значений полей структуры на примере PLOT [Maple]
Сообщение13.05.2020, 17:09 


11/07/16
686
Согласно справке, так можно изменить и другие опции графика.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: maxal, Toucan, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group