2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение10.10.2014, 23:58 


24/07/14
138
Задача такая: нужно взять какую-то стандартную цветовую гамму, например, "AvocadoColors", и модифицировать ее, получив в итоге другую гамму, готовую к использованию. В моем конкретном случае модификация заключается в том, что на гамму градиентно накладываются две белые полосы. Вот результат:
Изображение
Вот реализация:
Код:
pS = 30;
a1 = 0.25; a2 = 0.75;
Color = Lighter[ColorData["BlueGreenYellow"][#],1/Cosh[(# - a1) pS] + 1/Cosh[(# - a2) pS]] &;

Но при такой реализации возникает проблема: на работу с такой гаммой уходит много времени. В результате значительно возрастает время обработки любого графика с этой гаммой.
Может быть кто-то может подсказать как эту задачу можно решить более оптимальным способом?

И еще пару мелких вопросов
При работе с DensityPlot[f[x,y],...] по умолчанию включена функция ColorFunctionScaling, которая переводит границы изменения функции f[x,y] на отрезок [0,1]. Эту функцию можно отключить и вручную настраивать отображение множества значений функции f[x,y] в цветовую гамму(например, через такую функцию Color[], как написано выше). Но вопрос немного не об этом:) Есть ли возможность какой-либо настройки параметра PlotLegends – например, сделать так чтобы гамма на легенде соответствовала большему интервалу, чем интервал изменения функции f[x,y]. Например, пусть f[x,y] меняется от 1 до 2. Я хочу разукрасить ее с запасом, предполагая, что когда-нибудь эта функция может принять значения большие 2, но, например, не выше 3. Поэтому я отображаю ее значения не во всю цветовую гамму, а только в ее первую половину(т.е. полная цветовая гамма у меня получается при изменении аргумента функции Color[] от 1 до 3). Но тогда появляется проблема с PlotLegends – на ней тоже только половина гаммы, т.е. только те значения, которые принимает f[x,y]. А мне нужно чтобы там была вся гамма полностью.
Если вы поняли, что я имею в виду, подскажите как решить эту проблему. Мне пришлось отдельно нарисовать нужную легенду и вставить ее в код в виде картинки: PlotLegends -> Placed[Show[(*здесь стоит картинка*)], After]. Ну понятно, что это уродство какое-то, но по другому как-то не получилось.

Еще вопросы:
1. DensityPlot рисует графики с какими-то белыми полями между осями и самим графиком. Они видны, например, на рисунке гаммы выше: там эти поля около 1 мм., но при больших графиках они становятся больше и гораздо заметнее. Можно ли их как-нибудь убрать?
2. Можно ли настроить размер координат на PlotLegends? (обычно это функция TicksStyle или еще что такое)

И еще один серьезный вопрос: есть ли какой-то более удобный и более мощный чем Математика пакет, заточенный под визуализацию? А то в математике как-то много проблем возникает с какими-нибудь не совсем тривиальными графиками.

-- 11.10.2014, 00:39 --

Еще вопрос. Допустим мне нужно наделать картинок, каждая из которых состоит из двух графиков (один под другим). Оси Х в них одни и те же. Как мне выровнять эти графики так, чтобы их оси были ровно одна под другой? Пока у меня получается так:
Изображение
Правые края рамок выравнены так как надо, а левые сдвинуты по отношению друг к другу. Код в этом случае выглядит примерно так:
TableForm[{Show[Image[Plot[...]]], Show[Image[Plot[...]]]}]

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 12:30 
Заслуженный участник


25/02/11
1786
_Er в сообщении #917480 писал(а):
Но при такой реализации возникает проблема: на работу с такой гаммой уходит много времени.

Можно дискретизировать и посчитать один раз. Если, скажем, у этой функции одни аргумент, принимающий значения из $[0,1]$, то так:
Код:
f= Lighter[ColorData["BlueGreenYellow"][#],1/Cosh[(# - a1) pS] + 1/Cosh[(# - a2) pS]] &;
clrtbl=Table[f[k],{k,0,1,10^-3}];
Color=clrtbl[Floor[1000#]]&;

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 18:48 


24/07/14
138
Vince Diesel, спасибо за совет! Так действительно гораздо лучше. Время построения квадратика из головного сообщения темы уменьшилось в 18 раз: с 5.6 до 0.31 секунды. Только у вас в коде потеряна пара скобок в вызове элемента таблицы. Должно быть так:
Color = clrtbl[[Floor[1000 #]]] &;

Может кто-нибудь может ответить на остальные вопросы?:) В частности про PlotLegends хотел бы узнать и про выравнивание графиков один под другим – много с этим проблем.

-- 11.10.2014, 18:57 --

И еще один момент в последней строчке вашего кода: у вас имеется вызов нулевого элемента таблицы (которого нет). Из-за этого гамма получается с небольшим уродством в самом начале шкалы. Лучше будет если сделать вот так:
Color = clrtbl[[Round[1000 # + 1]]] &;

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 20:16 


24/07/14
138
Рассказываю как решается проблема с PlotLegends. Ну вообще получилось довольно кривовато, Математика даже красным часть кода выделяет (интересно, кстати, что она хочет сказать?). Но в принципе вроде бы работает. Идея такая:
1. Функцию при подаче в DensityPlot[] преобразовываем так чтобы она принимала значения из нужного интервала (удобнее всего интервал [0,1], наверное).
В параметрах графика ставим ColorFunctionScaling -> False.
2. PlotLegends подаем отдельно:
PlotLegends -> Placed[BarLegend[{Color, {fmin, fmax}}, ColorFunctionScaling -> True], After]]
Вот как раз ColorFunctionScaling -> True она выделяет красным, но вроде работает нормально.

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 20:20 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
_Er в сообщении #917704 писал(а):
Математика даже красным часть кода выделяет (интересно, кстати, что она хочет сказать?)
В контекстном меню есть функция «Why the coloring?...»

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 20:26 
Заслуженный участник


25/02/11
1786
Бывает, что подсветка не распознает некоторые опции как законные для данной команды.

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 20:27 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Ни разу такого не видел. До сегодняшнего дня ;-) Тут Математика действительно пишет «An unknown option name has been used.», но не останавливает работу.

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 21:34 


08/03/11
186
_Er в сообщении #917669 писал(а):
... про выравнивание графиков один под другим ...

Код:
GraphicsGrid[{
  {Plot[Sin[x], {x, 0, 2 Pi}, ImagePadding -> {{40, 0}, {0, 0}}]},
  {Plot[10^-12 Sin[x], {x, 0, 2 Pi},
    ImagePadding -> {{40, 0}, {0, 0}}]}
  }]
DensityPlot[Sin[x] Sin[y], {x, -4, 4}, {y, -3, 3},
PlotRangePadding -> None]

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 21:47 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Минус здесь в том, что это ручная подгонка, и для каждого случая нужно подбирать числа. Я пытался поиграться с опциями AlignmentPoint и BaselinePosition; ничего не вышло, но это, наверное, руки кривые. Возможно, эти опции помогут.

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение12.10.2014, 10:40 


24/07/14
138
sithif в сообщении #917762 писал(а):
ImagePadding
Ну вроде выровнять(хоть и вручную) можно, но у меня эта функция стабильно обрезает или часть графика, или координаты на осях. В общем что-то не то.

Честно говоря, чем больше работаю с Математикой, тем больше проблем в ней каких-то находится. Элементарную по своей идее анимацию (densityplot[f[x,t],...] со своей гаммой цветов, последовательно заполняющийся с ростом t, а под ним Plot[f[x,t]\.t->p] показывающий профиль функции f[x,t] в конкретный момент времени t) строю в сумме уже часов 8, наверное. И не могу построить. То с гаммой этой проблемы, то с выравниванием. Запустил, например, вчера код: примерно за час анимация была готова, но когда я ее открыл оказалось что она каким-то образом сдвинута куда-то за экран, так что видна только ее половина. Потом решил все кадры отдельно в картинки выгрузить и из картинок анимацию сделать и тут обнаружил, что на первых 20 кадрах densityplot какой-то багованный – половина информативной части графика просто белая.
Когда будет время свободное нужно обязательно попробовать другие пакеты для визуализации. Только вот не знаю какие там крутые есть.

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение12.10.2014, 11:58 


08/03/11
186
_Er
Можете попробовать gnuplot или ParaView.

Кстати, если у вас прямоугольная область, то можете попробовать ArrayPlot вместо DensityPlot, например:
(хотя не уверен, что правильно сравнил )

Код:
f[x_, y_] := Sin[x] Sin[y];
plot = DensityPlot[Evaluate[f[x, y]], {x, -3, 3}, {y, -3, 3}, ColorFunction -> Hue, PlotPoints -> {601, 601}, MaxRecursion -> 0] // AbsoluteTiming
plot // ByteCount

SetSharedVariable[data] ;
data = (*Parallel*)Table[Sin[x] Sin[y], {x, -3, 3, 0.01}, {y, -3, 3, 0.01}]; // AbsoluteTiming
plot = ArrayPlot[data, DataReversed -> True, ColorFunction -> Hue, PixelConstrained -> 1] // AbsoluteTiming
plot // ByteCount

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение12.10.2014, 13:57 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Цитата:
половина информативной части графика просто белая.
так бывает. попробуйте PlotRange -> All.

Зачем пишется Plot[f[x,t]\.t->p], а не Plot[f[x,p]]?

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение12.10.2014, 16:39 


24/07/14
138
Mysterious Light в сообщении #917959 писал(а):
так бывает. попробуйте PlotRange -> All.
У меня стоит один фиксированный PlotRange на всю анимацию. И там проблема в другом как мне кажется. Прикладываю картинку. Слева кусок 120-го кадра, справа кусок 25-го кадра: в их общей части они должны быть абсолютно одинаковы.
Изображение

\.t->p пишу потому что функция хранится у меня просто как f[8] :)

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение12.10.2014, 17:27 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
По моей практике, белый цвет означает плохие данные: или вне PlotRange, или значения комплексны (даже с 0 I), или не числа, или ещё что.
Наконец, можно Plot3D поставить и сравнить кадры. Возможно, проблема в функции.

 Профиль  
                  
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение12.10.2014, 22:51 


24/07/14
138
Mysterious Light в сообщении #918041 писал(а):
По моей практике, белый цвет означает плохие данные: или вне PlotRange, или значения комплексны (даже с 0 I), или не числа, или ещё что.
Наконец, можно Plot3D поставить и сравнить кадры. Возможно, проблема в функции.
Добавление Re[] не помогает. Plot3D нормальный, такой как должен быть. Черт его знает в чем там дело. К счастью мне не горит, так что, скорее всего, я отложу эту задачу на потом, и делать ее уже буду в каком-нибудь другом пакете, только не знаю пока в каком.

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

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



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

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


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

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