Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
wiki:sagemath [2013/02/19 18:05] [Вывод графиков] |
wiki:sagemath [2013/03/20 01:48] (текущий) [Вывод графиков] |
||
---|---|---|---|
Строка 38: | Строка 38: | ||
Практические примеры разной сложности доступны в документации к самому программному пакету «**SageMath**» (см. [[http://www.sagemath.org/doc/tutorial/|Tutorial]]) и к входящим в него библиотекам. Непосредственную консультацию по конкретному вопросу можно получить в [[http://ask.sagemath.org/questions/|AskSage]]. | Практические примеры разной сложности доступны в документации к самому программному пакету «**SageMath**» (см. [[http://www.sagemath.org/doc/tutorial/|Tutorial]]) и к входящим в него библиотекам. Непосредственную консультацию по конкретному вопросу можно получить в [[http://ask.sagemath.org/questions/|AskSage]]. | ||
- | Консольный режим и веб-интерфейс поддерживают автодополнение команд и переменных (наберите начало команды, а затем нажмите <key>Tab</key>). Поучение краткой информации о команде возможно с использование символа «?», например, | + | Консольный режим и веб-интерфейс поддерживают автодополнение команд и переменных (наберите начало команды, а затем нажмите <key>Tab</key>). Получение краткой информации о команде возможно с использование символа «?», например, |
<code=python>notebook?</code> | <code=python>notebook?</code> | ||
При этом откроется консольный интерфейс просмотра документации, выйти из него можно нажав кнопку <key>Q</key> | При этом откроется консольный интерфейс просмотра документации, выйти из него можно нажав кнопку <key>Q</key> | ||
Строка 48: | Строка 48: | ||
или просто в консоли «**BASH**» ввести | или просто в консоли «**BASH**» ввести | ||
<code=bash>echo "load Main.sage" | sage</code> | <code=bash>echo "load Main.sage" | sage</code> | ||
- | в таком случае «**SageMath**» закроется по завершении, что удобно для применения в скриптах. В подкаталоге «SVG» должны появится файлы графиков (из-за наличия недоработок в «**librsvg**» изображения следует просматривать в «**Inkscape**» или «**Firefox**»), например, такие | + | в таком случае «**SageMath**» закроется по завершении, что удобно для применения в скриптах. В подкаталоге «SVG» должны появится файлы графиков (из-за наличия недоработок в «**librsvg**» изображения следует просматривать в «**Inkscape**» или «**Firefox**»), например, такие \\ |
{{:wiki:sagemath:aliasing-example.png?direct&200|}} {{:wiki:sagemath:ideal-ntf.png?direct&200|}} {{:wiki:sagemath:linear-quantization-example-difference.png?direct&200|}} {{:wiki:sagemath:noise-shaping-in-frequency-domain.png?direct&200|}} {{:wiki:sagemath:quantizer-transfer-function-b.png?direct&200|}} | {{:wiki:sagemath:aliasing-example.png?direct&200|}} {{:wiki:sagemath:ideal-ntf.png?direct&200|}} {{:wiki:sagemath:linear-quantization-example-difference.png?direct&200|}} {{:wiki:sagemath:noise-shaping-in-frequency-domain.png?direct&200|}} {{:wiki:sagemath:quantizer-transfer-function-b.png?direct&200|}} | ||
+ | |||
Используя код из этих примеров можно получить свои графики. | Используя код из этих примеров можно получить свои графики. | ||
+ | |||
+ | ==== Ещё один пример ==== | ||
+ | Цель -- получение такого графика | ||
+ | {{ :wiki:sagemath:godograf.png?direct&300 |}} | ||
+ | Выполнить программу можно в веб-интерфейсе «**SageMath**» ''notebook()''. Создайте новый лист («New Worksheet»), придумайте ему имя. Нажмите кнопку «Edit» для перехода в текстовый режим, выделите всё и замените на приведенный ниже код | ||
+ | <code=python> | ||
+ | {{{id=5| | ||
+ | # Сброс | ||
+ | reset() | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=3| | ||
+ | # Добавляем переменные для аналитических расчётов | ||
+ | var('p, T, omega, a, b, K1') | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=1| | ||
+ | # Задаём некие численные переменные | ||
+ | K = 80.0 | ||
+ | vK1 = 80.0 | ||
+ | va = 7 # это считается целым числом, что-бы сделать его дробным следует писать "7.0" или "7." | ||
+ | vb = 5 | ||
+ | vT = 0.1 | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=2| | ||
+ | # Некое уравнение | ||
+ | W1 = K1 / ((p + a)*(p + b)) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=6| | ||
+ | # Вывод в понятном для человека виде | ||
+ | show(W1) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=7| | ||
+ | # Вычисляем значение аналитической функции в точке (параметры указаны явно) | ||
+ | W1 = W1(a = va, b = vb) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=8| | ||
+ | show(W1); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=9| | ||
+ | # Ещё аналитические вычисления | ||
+ | S1 = (1 - e^(-p*T)) / p | ||
+ | S2 = S1 * W1 | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=10| | ||
+ | show(S1); show(S2); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=11| | ||
+ | # Знаменатель из выражения выше | ||
+ | A = S2.denominator(); | ||
+ | show(A); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=21| | ||
+ | # Раскрываем скобки и берём производную по p | ||
+ | Ad = A.expand().diff(p) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=14| | ||
+ | show(Ad) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=16| | ||
+ | # Числитель из S2 | ||
+ | B = S2.numerator(); | ||
+ | show(B); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=17| | ||
+ | # Находим корни уравнения A = 0 с указанием дополнительных параметров отображения результата для удобства | ||
+ | pz = solve(A == 0, p, solution_dict = True) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=18| | ||
+ | show(pz) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=19| | ||
+ | # Представляем корни в виде простого массива | ||
+ | pz = [s[p] for s in pz]; | ||
+ | show(pz); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=20| | ||
+ | # Построение более сложного уравнения с использованием цикла | ||
+ | s = 0 | ||
+ | l = len(pz) # длина массива pz | ||
+ | for i in range(0, l): # цикл | ||
+ | s = s + (B(p = pz[i]) / Ad(p = pz[i]))*(e^(p*T) / (e^(p*T) - e^(pz[i]*T))) | ||
+ | show(s) # вывод в красивой форме | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=22| | ||
+ | # Более сложное выражение на основе имеющихся | ||
+ | wl = s / (1 + s); | ||
+ | show(wl) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=24| | ||
+ | # Упрощаем используя все известные приёмы | ||
+ | wl = wl.simplify_full(); | ||
+ | show(wl); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=25| | ||
+ | # Знаменатель | ||
+ | A = wl.denominator(); | ||
+ | show(A); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=26| | ||
+ | # Значение в точке | ||
+ | A = A(K1 = vK1, T = vT); | ||
+ | show(A); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=27| | ||
+ | # Замена переменной p на jω, где j это мнимая единица, записывается как 1j без знака умножения | ||
+ | A = A(p = 1j*omega); | ||
+ | show(A); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=28| | ||
+ | # Действительная часть с упрощением выражения | ||
+ | Are = A.real().simplify_full(); | ||
+ | show(Are); | ||
+ | # Мнимая часть с упрощением выражения | ||
+ | Aim = A.imag().simplify_full(); | ||
+ | show(Aim); | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=29| | ||
+ | # Подготовка к выводу графика | ||
+ | omega2 = pi/vT; | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=30| | ||
+ | # Подключение библиотеки которая включает в себя другие полезные библиотеки, например, matplotlib для выводу графиков | ||
+ | # Хотя её можно подключить и отдельно | ||
+ | import pylab | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=31| | ||
+ | # Строим массивы численных данных для графиков | ||
+ | aw = pylab.linspace(0, 100, 1001) # линейный массив от 0 до 100 с 1001-отсчётом | ||
+ | aRe = pylab.array([]) # пустой массив | ||
+ | aRe = pylab.resize(aRe, pylab.size(aw)) # меняем размер | ||
+ | aIm = pylab.array([]) | ||
+ | aIm = pylab.resize(aIm, pylab.size(aw)) | ||
+ | for i in range(0, pylab.size(aw)): | ||
+ | aRe[i] = Are(omega = aw[i]) | ||
+ | aIm[i] = Aim(omega = aw[i]) | ||
+ | |||
+ | aw2 = pylab.linspace(0, 60, 11) | ||
+ | aRe2 = pylab.array([]) | ||
+ | aRe2 = pylab.resize(aRe2, pylab.size(aw2)) | ||
+ | aIm2 = pylab.array([]) | ||
+ | aIm2 = pylab.resize(aIm2, pylab.size(aw2)) | ||
+ | for i in range(0, pylab.size(aw2)): | ||
+ | aRe2[i] = Are(omega = aw2[i]) | ||
+ | aIm2[i] = Aim(omega = aw2[i]) | ||
+ | |||
+ | aw3 = pylab.linspace(0, omega2, 1001) | ||
+ | aRe3 = pylab.array([]) | ||
+ | aRe3 = pylab.resize(aRe3, pylab.size(aw3)) | ||
+ | aIm3 = pylab.array([]) | ||
+ | aIm3 = pylab.resize(aIm3, pylab.size(aw3)) | ||
+ | for i in range(0, pylab.size(aw3)): | ||
+ | aRe3[i] = Are(omega = aw3[i]) | ||
+ | aIm3[i] = Aim(omega = aw3[i]) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=33| | ||
+ | Name = 'image' # текстовая строка для названия рисунка | ||
+ | Font1 = pylab.matplotlib.font_manager.FontProperties(family = 'CMU Serif', size = 12) # шрифт | ||
+ | Fig = pylab.figure() # новый рисунок | ||
+ | Fig.set_size_inches([10., 10.]) # размер рисунка в дюймах | ||
+ | Fig.hold(True) # не стирать имеющиеся графики с рисунка при выводе новых | ||
+ | #------------------------------------------------------------------------------------------------- | ||
+ | Axis = pylab.subplot(111) # создаём поле для рисования графика | ||
+ | Fig.add_subplot(Axis) | ||
+ | # Шрифт для меток осей координат по X и Y | ||
+ | pylab.xticks(fontproperties = Font1) | ||
+ | pylab.yticks(fontproperties = Font1) | ||
+ | #Axis.grid(b = True, which='major', linestyle = 'none') | ||
+ | Axis.set_axis_bgcolor([1., 1., 1.]) # цвет фона графика RGB (1, 1, 1) = белый | ||
+ | Axis.set_frame_on(True) # обрамление | ||
+ | Axis.set_title('', fontproperties = Font1) # шрифт заголовка | ||
+ | # Место положения названия оси координат в относительных единицах по X | ||
+ | Axis.xaxis.set_label_coords(1.02, 0.02) | ||
+ | Axis.yaxis.set_label_coords(0.02, 1.02) | ||
+ | # Координатная сетка (тип сетки, тип линии, ширина линии, цвет) | ||
+ | # большая | ||
+ | Axis.grid(which='major', linestyle = '--', linewidth=0.5, color=[0., 0., 0.]) | ||
+ | # мелкая | ||
+ | Axis.grid(which='minor', linestyle=':', linewidth=1., color=[0., 0., 0.]) | ||
+ | # Названия осей | ||
+ | Axis.set_xlabel('X', | ||
+ | fontproperties = Font1, | ||
+ | rotation='horizontal', | ||
+ | weight='normal', | ||
+ | size='large') | ||
+ | Axis.set_ylabel('Y', | ||
+ | fontproperties = Font1, | ||
+ | rotation='horizontal', | ||
+ | weight='normal', | ||
+ | size='large') | ||
+ | # Штрихи на осях | ||
+ | Axis.xaxis.set_ticks_position('bottom') # внизу на X | ||
+ | Axis.yaxis.set_ticks_position('left') # и слева на Y | ||
+ | # Масштаб осей (linear - линейный, log - логарифмический) | ||
+ | Axis.set_xscale('linear') | ||
+ | Axis.set_yscale('linear') | ||
+ | # Границы осей по значениям | ||
+ | #Axis.set_xlim(0, 0.9) | ||
+ | #Axis.set_ylim(0, 1.2) | ||
+ | #------------------------------------------------------------------------------------------------- | ||
+ | # Рисуем кривые на графике | ||
+ | Curve = Axis.plot(aRe, aIm, # данные, X и Y в виде массивов | ||
+ | linestyle = '-', # тип линии | ||
+ | linewidth = 1, # толщина линии | ||
+ | fillstyle = 'full', # заполнение | ||
+ | color = [0., 0., 0.], # цвет линии | ||
+ | marker = 'None', # маркер для точки | ||
+ | markeredgecolor = [0., 0., 0.], # цвет границы маркера | ||
+ | markeredgewidth = 0.5, # толщина границы маркера | ||
+ | markerfacecolor = [0., 0., 0.], # цвет заливки маркера | ||
+ | markerfacecoloralt = [0., 0., 0.], # дополнительный цвет | ||
+ | markersize = 6, # размер маркера | ||
+ | dash_joinstyle = 'round' # тип соединения линий | ||
+ | )[0]; # Axis.plot позволяет рисовать сразу много кривых и выдаёт их идентификаторы как массив, нам нужен 0-й элемент | ||
+ | Curve = Axis.plot(aRe2, aIm2, | ||
+ | linestyle = 'None', | ||
+ | linewidth = 1, | ||
+ | fillstyle = 'full', | ||
+ | color = [0., 0., 0.], | ||
+ | marker = 'o', | ||
+ | markeredgecolor = [0., 0., 0.], | ||
+ | markeredgewidth = 0.5, | ||
+ | markerfacecolor = [0., 0., 0.], | ||
+ | markerfacecoloralt = [0., 0., 0.], | ||
+ | markersize = 6, | ||
+ | dash_joinstyle = 'round' | ||
+ | )[0]; | ||
+ | Curve = Axis.plot(aRe3, aIm3, | ||
+ | linestyle = '-', | ||
+ | linewidth = 3, | ||
+ | fillstyle = 'full', | ||
+ | color = [0., 0., 0.], | ||
+ | marker = 'None', | ||
+ | markeredgecolor = [0., 0., 0.], | ||
+ | markeredgewidth = 0.5, | ||
+ | markerfacecolor = [0., 0., 0.], | ||
+ | markerfacecoloralt = [0., 0., 0.], | ||
+ | markersize = 6, | ||
+ | dash_joinstyle = 'round' | ||
+ | )[0]; | ||
+ | Curve = Axis.plot((Are(omega = omega2)).n(), (Aim(omega = omega2)).n(), | ||
+ | linestyle = 'None', | ||
+ | linewidth = 3, | ||
+ | fillstyle = 'full', | ||
+ | color = [0., 0., 0.], | ||
+ | marker = 's', | ||
+ | markeredgecolor = [0., 0., 0.], | ||
+ | markeredgewidth = 0.5, | ||
+ | markerfacecolor = [0., 0., 0.], | ||
+ | markerfacecoloralt = [0., 0., 0.], | ||
+ | markersize = 6, | ||
+ | dash_joinstyle = 'round' | ||
+ | )[0]; | ||
+ | #------------------------------------------------------------------------------------------------- | ||
+ | # Хитрим для отображения меток посреди графика | ||
+ | dx = (Axis.get_xlim()[1] - Axis.get_xlim()[0]) | ||
+ | dy = (Axis.get_ylim()[1] - Axis.get_ylim()[0]) | ||
+ | bbox_props = dict(boxstyle="round4", fc=[1.0, 1.0, 1.0], ec=[1.0, 1.0, 1.0], alpha=1.0) | ||
+ | for i in range(0, pylab.size(aw2)): | ||
+ | Axis.text(aRe2[i]+dx*0.001, aIm2[i]+dy*0.02, '$\omega = ' + latex(aw2[i]) + '$', ha="center", va="bottom", size=12, bbox=bbox_props) | ||
+ | |||
+ | Axis.text((Are(omega = omega2)).n()+dx*0.001, (Aim(omega = omega2)).n()+dy*0.02, '$\omega = \pi / T$', ha="center", va="bottom", size=12, bbox=bbox_props) | ||
+ | #------------------------------------------------------------------------------------------------- | ||
+ | # Задаём имя файла и сохраняем график в него | ||
+ | FileName = os.path.join(Name + '.svg'); | ||
+ | Fig.savefig(FileName, dpi = 96) | ||
+ | /// | ||
+ | }}} | ||
+ | |||
+ | {{{id=35| | ||
+ | |||
+ | /// | ||
+ | }}}</code> | ||
+ | |||
+ | Нажмите «Save changes» и затем в списке «Action» выберите «Evaluate All», подождите пока всё завершится. Внизу должен появится график. Он имеет дефект, но это поправимо средствами «**Inkscape**». | ||
+ | |||
+ | Если Вы хотите выполнить этот код в терминале «**SageMath**», то ниже приведен тот же код что и выше, только без синтаксиса веб-интерфейса и без команд show(), выполнение которых в терминале приведёт к генерации ''*.dvi'' файла для каждого выражения, а это негативно скажется на быстроте работы ОС. | ||
+ | |||
+ | <code=python># Очиска консоли | ||
+ | os.system('clear') | ||
+ | print('--Begin-----------------------------------------------------------------------') | ||
+ | |||
+ | # Сброс | ||
+ | reset() | ||
+ | |||
+ | # Добавляем переменные для аналитических расчётов | ||
+ | var('p, T, omega, a, b, K1') | ||
+ | |||
+ | # Задаём некие численные переменные | ||
+ | K = 80.0 | ||
+ | vK1 = 80.0 | ||
+ | va = 7 # это считается целым числом, что-бы сделать его дробным следует писать "7.0" или "7." | ||
+ | vb = 5 | ||
+ | vT = 0.1 | ||
+ | |||
+ | # Некое уравнение | ||
+ | W1 = K1 / ((p + a)*(p + b)) | ||
+ | |||
+ | # Вычисляем значение аналитической функции в точке (параметры указаны явно) | ||
+ | W1 = W1(a = va, b = vb) | ||
+ | |||
+ | # Ещё аналитические вычисления | ||
+ | S1 = (1 - e^(-p*T)) / p | ||
+ | S2 = S1 * W1 | ||
+ | |||
+ | # Знаменатель из выражения выше | ||
+ | A = S2.denominator(); | ||
+ | |||
+ | # Раскрываем скобки и берём производную по p | ||
+ | Ad = A.expand().diff(p) | ||
+ | |||
+ | # Числитель из S2 | ||
+ | B = S2.numerator(); | ||
+ | |||
+ | # Находим корни уравнения A = 0 с указанием дополнительных параметров отображения результата для удобства | ||
+ | pz = solve(A == 0, p, solution_dict = True) | ||
+ | |||
+ | # Представляем корни в виде простого массива | ||
+ | pz = [s[p] for s in pz]; | ||
+ | |||
+ | # Построение более сложного уравнения с использованием цикла | ||
+ | s = 0 | ||
+ | l = len(pz) # длина массива pz | ||
+ | for i in range(0, l): # цикл | ||
+ | s = s + (B(p = pz[i]) / Ad(p = pz[i]))*(e^(p*T) / (e^(p*T) - e^(pz[i]*T))) | ||
+ | |||
+ | # Более сложное выражение на основе имеющихся | ||
+ | wl = s / (1 + s); | ||
+ | |||
+ | # Упрощаем используя все известные приёмы | ||
+ | wl = wl.simplify_full(); | ||
+ | |||
+ | # Знаменатель | ||
+ | A = wl.denominator(); | ||
+ | |||
+ | # Значение в точке | ||
+ | A = A(K1 = vK1, T = vT); | ||
+ | |||
+ | # Замена переменной p на jω, где j это мнимая единица, записывается как 1j без знака умножения | ||
+ | A = A(p = 1j*omega); | ||
+ | |||
+ | # Действительная часть с упрощением выражения | ||
+ | Are = A.real().simplify_full(); | ||
+ | |||
+ | # Мнимая часть с упрощением выражения | ||
+ | Aim = A.imag().simplify_full(); | ||
+ | |||
+ | # Подготовка к выводу графика | ||
+ | omega2 = pi/vT; | ||
+ | |||
+ | # Подключение библиотеки которая включает в себя другие полезные библиотеки, например, matplotlib для выводу графиков | ||
+ | # Хотя её можно подключить и отдельно | ||
+ | import pylab | ||
+ | #------------------------------------------------------ | ||
+ | # Строим массивы численных данных для графиков | ||
+ | aw = pylab.linspace(0, 100, 1001) # линейный массив от 0 до 100 с 1001-отсчётом | ||
+ | aRe = pylab.array([]) # пустой массив | ||
+ | aRe = pylab.resize(aRe, pylab.size(aw)) # меняем размер | ||
+ | aIm = pylab.array([]) | ||
+ | aIm = pylab.resize(aIm, pylab.size(aw)) | ||
+ | for i in range(0, pylab.size(aw)): | ||
+ | aRe[i] = Are(omega = aw[i]) | ||
+ | aIm[i] = Aim(omega = aw[i]) | ||
+ | |||
+ | aw2 = pylab.linspace(0, 60, 11) | ||
+ | aRe2 = pylab.array([]) | ||
+ | aRe2 = pylab.resize(aRe2, pylab.size(aw2)) | ||
+ | aIm2 = pylab.array([]) | ||
+ | aIm2 = pylab.resize(aIm2, pylab.size(aw2)) | ||
+ | for i in range(0, pylab.size(aw2)): | ||
+ | aRe2[i] = Are(omega = aw2[i]) | ||
+ | aIm2[i] = Aim(omega = aw2[i]) | ||
+ | |||
+ | aw3 = pylab.linspace(0, omega2, 1001) | ||
+ | aRe3 = pylab.array([]) | ||
+ | aRe3 = pylab.resize(aRe3, pylab.size(aw3)) | ||
+ | aIm3 = pylab.array([]) | ||
+ | aIm3 = pylab.resize(aIm3, pylab.size(aw3)) | ||
+ | for i in range(0, pylab.size(aw3)): | ||
+ | aRe3[i] = Are(omega = aw3[i]) | ||
+ | aIm3[i] = Aim(omega = aw3[i]) | ||
+ | #------------------------------------------------------------------------------------------------- | ||
+ | Name = 'O_o' | ||
+ | Font1 = pylab.matplotlib.font_manager.FontProperties(family = 'CMU Serif', size = 12) # шрифт | ||
+ | Fig = pylab.figure() # новый рисунок | ||
+ | Fig.set_size_inches([10., 10.]) # размер рисунка в дюймах | ||
+ | Fig.hold(True) # не стирать имеющиеся графики с рисунка при выводе новых | ||
+ | #------------------------------------------------------------------------------------------------- | ||
+ | Axis = pylab.subplot(111) # создаём оси - поле для рисования графика | ||
+ | Fig.add_subplot(Axis) | ||
+ | # Шрифт для меток осей координат по X и Y | ||
+ | pylab.xticks(fontproperties = Font1) | ||
+ | pylab.yticks(fontproperties = Font1) | ||
+ | #Axis.grid(b = True, which='major', linestyle = 'none') | ||
+ | Axis.set_axis_bgcolor([1., 1., 1.]) # цвет фона графика RGB (1, 1, 1) = белый | ||
+ | Axis.set_frame_on(True) # обрамление | ||
+ | Axis.set_title('', fontproperties = Font1) # шрифт заголовка | ||
+ | # Место положения названия оси координат в относительных единицах по X | ||
+ | Axis.xaxis.set_label_coords(1.02, 0.02) | ||
+ | Axis.yaxis.set_label_coords(0.02, 1.02) | ||
+ | # Координатная сетка (тип сетки, тип линии, ширина линии, цвет) | ||
+ | # большая | ||
+ | Axis.grid(which='major', linestyle = '--', linewidth=0.5, color=[0., 0., 0.]) | ||
+ | # мелкая | ||
+ | Axis.grid(which='minor', linestyle=':', linewidth=1., color=[0., 0., 0.]) | ||
+ | # Названия осей | ||
+ | Axis.set_xlabel('X', | ||
+ | fontproperties = Font1, | ||
+ | rotation='horizontal', | ||
+ | weight='normal', | ||
+ | size='large') | ||
+ | Axis.set_ylabel('Y', | ||
+ | fontproperties = Font1, | ||
+ | rotation='horizontal', | ||
+ | weight='normal', | ||
+ | size='large') | ||
+ | # Штрихи на осях | ||
+ | Axis.xaxis.set_ticks_position('bottom') # внизу на X | ||
+ | Axis.yaxis.set_ticks_position('left') # и слева на Y | ||
+ | # Масштаб осей (linear - линейный, log - логарифмический) | ||
+ | Axis.set_xscale('linear') | ||
+ | Axis.set_yscale('linear') | ||
+ | # Границы осей по значениям | ||
+ | #Axis.set_xlim(0, 0.9) | ||
+ | #Axis.set_ylim(0, 1.2) | ||
+ | #------------------------------------------------------------------------------------------------- | ||
+ | Curve = Axis.plot(aRe, aIm, | ||
+ | linestyle = '-', | ||
+ | linewidth = 1, | ||
+ | fillstyle = 'full', | ||
+ | color = [0., 0., 0.], | ||
+ | marker = 'None', | ||
+ | markeredgecolor = [0., 0., 0.], | ||
+ | markeredgewidth = 0.5, | ||
+ | markerfacecolor = [0., 0., 0.], | ||
+ | markerfacecoloralt = [0., 0., 0.], | ||
+ | markersize = 6, | ||
+ | dash_joinstyle = 'round' | ||
+ | )[0]; | ||
+ | Curve = Axis.plot(aRe2, aIm2, | ||
+ | linestyle = 'None', | ||
+ | linewidth = 1, | ||
+ | fillstyle = 'full', | ||
+ | color = [0., 0., 0.], | ||
+ | marker = 'o', | ||
+ | markeredgecolor = [0., 0., 0.], | ||
+ | markeredgewidth = 0.5, | ||
+ | markerfacecolor = [0., 0., 0.], | ||
+ | markerfacecoloralt = [0., 0., 0.], | ||
+ | markersize = 6, | ||
+ | dash_joinstyle = 'round' | ||
+ | )[0]; | ||
+ | Curve = Axis.plot(aRe3, aIm3, | ||
+ | linestyle = '-', | ||
+ | linewidth = 3, | ||
+ | fillstyle = 'full', | ||
+ | color = [0., 0., 0.], | ||
+ | marker = 'None', | ||
+ | markeredgecolor = [0., 0., 0.], | ||
+ | markeredgewidth = 0.5, | ||
+ | markerfacecolor = [0., 0., 0.], | ||
+ | markerfacecoloralt = [0., 0., 0.], | ||
+ | markersize = 6, | ||
+ | dash_joinstyle = 'round' | ||
+ | )[0]; | ||
+ | Curve = Axis.plot((Are(omega = omega2)).n(), (Aim(omega = omega2)).n(), | ||
+ | linestyle = 'None', | ||
+ | linewidth = 3, | ||
+ | fillstyle = 'full', | ||
+ | color = [0., 0., 0.], | ||
+ | marker = 's', | ||
+ | markeredgecolor = [0., 0., 0.], | ||
+ | markeredgewidth = 0.5, | ||
+ | markerfacecolor = [0., 0., 0.], | ||
+ | markerfacecoloralt = [0., 0., 0.], | ||
+ | markersize = 6, | ||
+ | dash_joinstyle = 'round' | ||
+ | )[0]; | ||
+ | #------------------------------------------------------------------------------------------------- | ||
+ | dx = (Axis.get_xlim()[1] - Axis.get_xlim()[0]) | ||
+ | dy = (Axis.get_ylim()[1] - Axis.get_ylim()[0]) | ||
+ | bbox_props = dict(boxstyle="round4", fc=[1.0, 1.0, 1.0], ec=[1.0, 1.0, 1.0], alpha=1.0) | ||
+ | for i in range(0, pylab.size(aw2)): | ||
+ | Axis.text(aRe2[i]+dx*0.001, aIm2[i]+dy*0.02, '$\omega = ' + latex(aw2[i]) + '$', ha="center", va="bottom", size=12, bbox=bbox_props) | ||
+ | |||
+ | Axis.text((Are(omega = omega2)).n()+dx*0.001, (Aim(omega = omega2)).n()+dy*0.02, '$\omega = \pi / T$', ha="center", va="bottom", size=12, bbox=bbox_props) | ||
+ | #------------------------------------------------------------------------------------------------- | ||
+ | FileName = os.path.join(Name + '.svg'); | ||
+ | Fig.savefig(FileName, dpi = 96) | ||
+ | print('[ OK ]\n') | ||
+ | print('--End-------------------------------------------------------------------------') | ||
+ | </code> | ||
+ | |||
===== Ссылки ===== | ===== Ссылки ===== | ||