Опубликован: 27.12.2010 | Уровень: специалист | Доступ: платный
Лекция 2:

Графика: основные принципы

Графика, порожденная функциями и другими числовыми данными

Двумерная графика

Как уже говорилось в начале, Mathematica располагает специальным арсеналом средств, позволяющих визуализировать числовые данные и функции. Самый простой и известный способ визуализировать функцию - это построить ее график. Это делается с помощью уже встречавшейся нам команды \text{\tt Plot}:

\tt
In[61]:=Plot[Sin[x], \{х, -$\pi$, $\pi$\}]

На самом деле команда \text{\tt Plot} генерирует по данной функции графические примитивы, директивы и опции и формирует затем соответствующую команду \text{\tt Graphics}:

\tt
In[62]:=InputForm[Plot[Sin[x], \{x, -$\pi$, $\pi$\}]] //Short \\ \\
Out[62]=Graphics[\{\{\{\}, \{\}, \{Hue[0.67, 0.6,\\
\phantom{Out[62]=Gr}0.6], Line[\{\{<<2>>, <<30>>\}]\}\}\}, \{<<6>>\}]

Таким образом, мы видим, что \text{\tt Plot}, на самом деле, строит ломаную линию. При желании этим можно воспользоваться:

\tt
In[63]:=gg = Plot[Sin[x], \{х, -$\pi$ ,$\pi$\}];\\
\phantom{In[63]:=}gg[\!\![l, 1, 3, 1]\!\!]\\ \\
Out[64]=Hue[0.67, 0.6, 0.6]

Вот мы вычленили директиву, предшествующую собственно ломаной. Ее можно подменить, например так:

\tt 
In[65]:=gg[\!\![l, 1, 3, l]\!\!] = Sequence [Red, Thick, Dashed];\\
\phantom{In[65]:=}gg

С одной стороны, в командах типа \text{\tt Plot} можно использовать опции обычной графики. С другой стороны, есть и специальные способы управления, главные из которых \text{\tt PlotStyle} и \text{\tt ColorFunction}. Опция \text{\tt PlotStyle} служит для использования уже знакомых нам графических директив. Теперь Mathematica сама поставит их в нужное место в команде \text{\tt Graphics}:

\tt
In[67]:=\{Plot[\{Red, Dashed, Thick, Sin[x]\}, \{x, -$\pi$, $\pi$\}],\\
\phantom{In[67]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\},\\
\phantom{In[67]:=\{P}PlotStyle $\to$ \{RGBColor[l, 0, 0], Dashed, Thick\}]\}

Опция \text{\tt ColorFunction} служит для управления цветом изображаемого графика. Имена и смысл переменных этой функции фиксированы (для каждого типа графики - свои, для обычного \text{\tt Plot}, например, это x, y ). В качестве примера раскрасим график в соответствии с кривизной соответствующей плоской кривой:

\tt
In[68]:=ClearAll[g];\\
\phantom{In[68]:=}cur[f\_][t\_] := $\frac{Abs[D[f[t],t,t]]}{(l+D[f[t],t]^2)^{3/2}}$;\\
\phantom{In[68]:=}g[t\_] = cur[Sin][t]; \\
\phantom{In[68]:=}\{Plot[Sin[x], {x, -$\pi$, $\pi$\}, PlotStyle $\to$ \{Thick\},\\
\phantom{In[68]:=Cl}ColorFunction $\to$ Function [\{x, y\}, Hue$[\frac{g[x]}{1.1}]$],\\
\phantom{In[68]:=Cl}ColorFunctionScaling $\to$ False],\\
\phantom{In[68]:=C}Plot[g[t], \{t, -$\pi$, $\pi$\}]\}

Замечание. На самом деле, чтобы картина была реалистичной, пришлось отмасштабировать кривизну так, чтобы она менялась от 0 до 1/2 (важно, чтобы не доходила до 1). Здесь мы пользуемся тем, что кривизна графика синуса меняется от нуля (на рисунке - красный) до единицы (синий). Опция \text{\tt ColorFunctionScaling }$\to$\text{ False} отключает автоматическое масштабирование функции, отвечающей за цвет, которое затемняет дело.

Перечислим теперь встроенные возможности функции \text{\tt Plot}. Во-первых, можно рисовать сразу несколько графиков, причем они автоматически получаются разноцветными. Можно и самим регулировать их вид (с помощью \text{\tt PlotStyle}):

\tt
In[72]:=\{Plot[\{Sin[x], 1.2Sin[2x], 1.3Sin[3x]\}, \{x, 0, 10\}],\\
\phantom{In[72]:=\{}Plot[\{Sin[х], 1.2Sin[2x], 1.3Sin[3x]\}, \{x, 0, 10\},\\
\phantom{In[72]:=\{P}PlotStyle $\to$ \{\{Red, Thick\}, \{Dashed, Blue\}, \{Orange\}\}]\}

Можно также закрашивать области, ограниченные графиком (графиками). Это исполняется с помощью опции \text{\tt Filling}, значение которой устанавливается в тип заполнения ("до оси", "подграфик", "надграфик"):

\tt 
In[73]:=Plot[\{Sin[x], 1.2Sin[2x], 1.3Sin[3x]\}, \{x, 0, 10\}, \\
\phantom{In[73]:=P}Filling $\to$ \{l $\to$ Axis, 2 $\to$ Bottom, 3 $\to$ Top\}]

Более хитрый вид заполнения: для 2-го объекта выбрано заполнение до 1-го. Можно также добавить директивы, как именно заполнять:

\tt 
In[74]:=\\
\phantom{In}\{Plot[\{Sin[x], 1.4Sin[2x]\}, \{х, 0, 10\}, Fillings $\to$ \{2 $\to$ \{1\}\}],\\
\phantom{In\{}Plot[\{Sin[x], 1.4Sin[2x]\}, \{x, 0, 10\},\\ 
\phantom{In\{P}Filling $\to$ \{2 $\to$ \{l, \{Red, Blue\}\}\}]\}

Можно явно указать, сколько точек участвуют в построении ломаной, изображающей кривую. Современные версии Mathematica сами следят за качеством графика, поэтому \text{\tt PlotPoints} в двумерной графике - это начальное количество точек аппроксимации (по умолчанию равен 50). Если картинка Mathematica не нравится, она сама подразобьет кривую столько раз, сколько ей захочется. Чтобы запретить ей это, нужно ограничить рекурсию с помощью опции \text{\tt MaxRecursion} (которая устанавливается в количество итераций). Чтобы увидеть точки-вершины ломаной, нужно использовать опцию \text{\tt Mesh}:

\tt
In[75]:=\{Plot[Sin[x], \{x, -$\pi$, $\pi$\}, Mesh$\to$All, MaxRecursion$\to$0],\\
\phantom{In[75]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\}, PlotPoints$\to$5, Mesh$\to$All,\\
\phantom{In[75]:=\{P}MaxRecursion$\to$0],\\
\phantom{In[75]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\}, PlotPoints$\to$5, Mesh$\to$All,\\
\phantom{In[75]:=\{P}MaxRecursion$\to$1],\\
\phantom{In[75]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\}, PlotPoints$\to$5, Mesh$\to$All]\}

Иногда полезно исключить из рассмотрения какие-нибудь точки. Для этого служит опция \text{\tt Exclusions}, которая устанавливается в условие:

\tt
In[76]:=\{Plot[Tan[x], \{х, -2$\pi$, 2$\pi$\}],\\
\phantom{In[76]:=\{}Plot[Tan[x], \{х, -2$\pi$, 2$\pi$\}, Exclusions$\to$\{Cos[x] == 0\}]\}

К двумерным способам представления числовых данных относятся так же:

  • \text{\tt ListPlot, ListLinePlot, ArrayPlot},
  • \text{\tt PolarPlot, ParametricPlot},
  • \text{\tt ContourPlot, DensityPlot},
  • \text{\tt RegionPlot}.

Первые три служат для изображения дискретных данных (одномерных или двумерных). Вот одномерные данные:

\tt 
In[77]:=data = Table [Random[], \{20\}];\\
\phantom{In[77]:=}\{ListPlot[data, Filling $\to$ Axis], \\
\phantom{In[77]:=d}ListLinePlot[data,Filling $\to$ Axis]}

А вот - двумерные. Обратите внимание, что \text{\tt ListLinePlot} просто соединяет последовательные точки линией.

\tt
In[79]:=\\
\phantom{In}data = Table[\{Cos[\#], Sin[\#]\} \& [Random[Real, 2$\pi$]], \{i, 1, 40\}];\\
\phantom{In}\{ListPlot[data, AspectRatio $\to$ Automatic],\\
\phantom{Ind}ListLinePlot[data, AspectRatio $\to$ Automatic]\}

\text{\tt ArrayPlot} изображает числа строки в виде раскрашенных квадратиков. По умолчанию они черно-белые, но можно их и раскрасить:

\tt In[81]:=ArrayPlot[Transpose[data]]

Можно задать цвета явно с помощью правил \text{\tt ColorRules}, можно использовать \text{\tt ColorFunction}. Мы нарисуем число \pi:

\tt
In[82]:=curpet[х\_, m\_, n\_] :=\\
\phantom{In[82]:=cu}Module[\{res, хх, i\},\\
\phantom{In[82]:=cur}(*Эта подпрограммка вычисляет цифры числа х и \\
\phantom{In[82]:=curp}организовывает их в массив\}*)\\
\phantom{In[82]:=cur}хх = N[x, m n];\\
\phantom{In[82]:=cur}res = \{RealDigits[хх, 10, m] [\!\![1]\!\!]\};\\
\phantom{In[82]:=cur}xx = xх/10$^{\text{RealDigits}[xx,10,m][\![2]\!]}$;\\
\phantom{In[82]:=cur}For[i = l, i $\le$ n - 1, i++,\\
\phantom{In[82]:=curp}res = res$\sim$Join$\sim$\{RealDigits[xx, 10, m, -m i - 1][\!\![1]\!\!]\}\\
\phantom{In[82]:=cur}];\\
\phantom{In[82]:=cur}res\\
\phantom{In[82]:=cu}];\\
\phantom{In[82]:=}rules = \{0$\to$Red, 1$\to$Pink, 2$\to$Orange, 3$\to$Brown, 4$\to$Yellow,\\
\phantom{In[82]:=cur}5$\to$Green, 6$\to$Cyan, 7$\to$Blue, 8$\to$Magenta, 9$\to$Purple\};
\tt
In[84]:={ArrayPlot[curpet[$\pi$, 40, 40], ColorRules$\to$rules],\\
\phantom{In[84]:=\{}ArrayPlot[curpet[$\pi$, 40, 40], ColorFunction$\to$"Pastel"\ \!\!\!],\\
\phantom{In[82]:=\{}ArrayPlot[curpet[$\pi$, 40, 40], ColorFunction$\to$"Rainbow"\ \!\!\!] \}

Команда \text{\tt PolarPlot} удобна для рисования кривых, заданных в полярных координатах. Имеется также ее модификация \text{\tt ListPolarPlot}:

\tt
In[85]:=PolarPlot[\{l, 1 + 1/2Sin[10t], 1/2\}, \{t, 0, 2Pi\},\\
\phantom{In[85]:=P}PlotStyle $\to$ \{Green, \{Dashed, Thick, Orange\},\\
\phantom{In[85]:=Pol}\{Thickness[0.005], Green\}\}]

Светлана Петрова
Светлана Петрова
Украина
Марина Семенова
Марина Семенова
Россия, г. Чебоксары