2014 dxdy logo

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

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




 
 Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение10.10.2014, 23:58 
Задача такая: нужно взять какую-то стандартную цветовую гамму, например, "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 
_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 
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 
Рассказываю как решается проблема с 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 
Аватара пользователя
_Er в сообщении #917704 писал(а):
Математика даже красным часть кода выделяет (интересно, кстати, что она хочет сказать?)
В контекстном меню есть функция «Why the coloring?...»

 
 
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 20:26 
Бывает, что подсветка не распознает некоторые опции как законные для данной команды.

 
 
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 20:27 
Аватара пользователя
Ни разу такого не видел. До сегодняшнего дня ;-) Тут Математика действительно пишет «An unknown option name has been used.», но не останавливает работу.

 
 
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение11.10.2014, 21:34 
_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 
Аватара пользователя
Минус здесь в том, что это ручная подгонка, и для каждого случая нужно подбирать числа. Я пытался поиграться с опциями AlignmentPoint и BaselinePosition; ничего не вышло, но это, наверное, руки кривые. Возможно, эти опции помогут.

 
 
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение12.10.2014, 10:40 
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 
_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 
Аватара пользователя
Цитата:
половина информативной части графика просто белая.
так бывает. попробуйте PlotRange -> All.

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

 
 
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение12.10.2014, 16:39 
Mysterious Light в сообщении #917959 писал(а):
так бывает. попробуйте PlotRange -> All.
У меня стоит один фиксированный PlotRange на всю анимацию. И там проблема в другом как мне кажется. Прикладываю картинку. Слева кусок 120-го кадра, справа кусок 25-го кадра: в их общей части они должны быть абсолютно одинаковы.
Изображение

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

 
 
 
 Re: Цвет в Mathematica(DensityPlot[]) и другие вопросы
Сообщение12.10.2014, 17:27 
Аватара пользователя
По моей практике, белый цвет означает плохие данные: или вне PlotRange, или значения комплексны (даже с 0 I), или не числа, или ещё что.
Наконец, можно Plot3D поставить и сравнить кадры. Возможно, проблема в функции.

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

 
 
 [ Сообщений: 15 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group