3D графики в LaTeX пакетом pgfplots в стиле MathCAD
Рассказано, как делать 3D графики в LaTeX файлах с помощью пакета pgfplots так, чтобы они были похожи на графики из MathCAD. Мне нравится такая цветовая схема как MathCAD, вот и решил попробовать.
Решение
Итак, используйте следующую карту цвета:
\pgfplotsset{ /pgfplots/colormap={mathcad}{rgb255(0cm)=(76,0,128) rgb255(2cm)=(0,14,147) rgb255(4cm)=(0,173,171) rgb255(6cm)=(32,205,0) rgb255(8cm)=(229,222,0) rgb255(10cm)=(255,13,0)} }
А это карта для графиков с стиле Matlab:
\pgfplotsset{ /pgfplots/colormap={matlab}{rgb255(0cm)=(0,0,128) rgb255(1cm)=(0,0,255) rgb255(3cm)=(0,255,255) rgb255(5cm)=(255,255,0) rgb255(7cm)=(255,0,0) rgb255(8cm)=(128,0,0)} }
В статье Установка и настройка программ для редактирования LaTeX файлов прочитайте, если надо, про установку всех нужных программ для работы с LaTeX.
Примеры
Ниже приведены примеры полных исходников некоторых примеров:
\documentclass[a4paper,12pt]{report} %%% Кодировки и шрифты %%% \usepackage[T2A]{fontenc} % Поддержка русских букв \usepackage[utf8]{inputenc} % Кодировка utf8 \usepackage[english, russian]{babel} % Языки: русский, английский %%% Цвета %%% \usepackage[usenames]{color} \usepackage{color} %%% Рисование графиков %%% \usepackage{pgfplots} \usepackage{float} \definecolor{plotgrid}{HTML}{ECECEC} % цвет сетки \pgfplotsset{ every axis legend/.append style={at={(0.5,-0.13)},anchor=north,legend cell align=left}, tick label style={font=\tiny\scriptsize}, label style={font=\scriptsize}, legend style={font=\scriptsize}, grid=both, minor tick num=2, major grid style={plotgrid}, minor grid style={plotgrid}, axis lines=left, legend style={draw=none}, /pgf/number format/.cd, 1000 sep={} } % Карта цвета для трехмерных графиков в стиле графиков Mathcad \pgfplotsset{ /pgfplots/colormap={mathcad}{rgb255(0cm)=(76,0,128) rgb255(2cm)=(0,14,147) rgb255(4cm)=(0,173,171) rgb255(6cm)=(32,205,0) rgb255(8cm)=(229,222,0) rgb255(10cm)=(255,13,0)} } % Карта цвета для трехмерных графиков в стиле графиков Matlab \pgfplotsset{ /pgfplots/colormap={matlab}{rgb255(0cm)=(0,0,128) rgb255(1cm)=(0,0,255) rgb255(3cm)=(0,255,255) rgb255(5cm)=(255,255,0) rgb255(7cm)=(255,0,0) rgb255(8cm)=(128,0,0)} } \begin{document} % Вывод графика \begin{figure} [H] \centering { \begin{tikzpicture} \begin{axis}[ xlabel={$x$}, ylabel={$y$}, zlabel={$f(x,y) = x\cdot y$}, height=12cm, width=12cm, z buffer=sort, colormap name=mathcad, ] \addplot3[only marks,scatter] coordinates { (0, 0, -0. 985379) (0, 1, -5.50572) (0, 2, -7.74578) (0, 3, -4.00693) (0, 4, -0.530504) (1, 0, -5.50572) (1, 1, -30.7627) (1, 2, -43.2789) (1, 3, -22.3884) (1, 4, -2.96415) (2, 0, -7.74578) (2, 1, -43.2789) (2, 2, -60.8873) (2, 3, -31.4973) (2, 4, -4.17014) (3, 0, -4.00693) (3, 1, -22.3884) (3, 2, -31.4973) (3, 3, -16.2937) (3, 4, -2.15723) (4, 0, -0.530504) (4, 1, -2.96415) (4, 2, -4.17014) (4, 3, -2.15723) (4, 4, -0.28561) }; \end{axis} \end{tikzpicture} } \caption{Прочность металлоизделий}\label{ChartsAjFkQrR} \end{figure} \end{document}
Для кода:
\documentclass[a4paper,12pt]{report} %%% Кодировки и шрифты %%% \usepackage[T2A]{fontenc} % Поддержка русских букв \usepackage[utf8]{inputenc} % Кодировка utf8 \usepackage[english, russian]{babel} % Языки: русский, английский %%% Цвета %%% \usepackage[usenames]{color} \usepackage{color} %%% Рисование графиков %%% \usepackage{pgfplots} \usepackage{float} \definecolor{plotgrid}{HTML}{ECECEC} % цвет сетки \pgfplotsset{ every axis legend/. append style={at={(0.5,-0.13)},anchor=north,legend cell align=left}, tick label style={font=\tiny\scriptsize}, label style={font=\scriptsize}, legend style={font=\scriptsize}, grid=both, minor tick num=2, major grid style={plotgrid}, minor grid style={plotgrid}, axis lines=left, legend style={draw=none}, /pgf/number format/.cd, 1000 sep={} } % Карта цвета для трехмерных графиков в стиле графиков Mathcad \pgfplotsset{ /pgfplots/colormap={mathcad}{rgb255(0cm)=(76,0,128) rgb255(2cm)=(0,14,147) rgb255(4cm)=(0,173,171) rgb255(6cm)=(32,205,0) rgb255(8cm)=(229,222,0) rgb255(10cm)=(255,13,0)} } % Карта цвета для трехмерных графиков в стиле графиков Matlab \pgfplotsset{ /pgfplots/colormap={matlab}{rgb255(0cm)=(0,0,128) rgb255(1cm)=(0,0,255) rgb255(3cm)=(0,255,255) rgb255(5cm)=(255,255,0) rgb255(7cm)=(255,0,0) rgb255(8cm)=(128,0,0)} } \begin{document} % Вывод графика \begin{figure} [H] \centering { \begin{tikzpicture} \begin{axis}[ xlabel={$x$}, ylabel={$y$}, zlabel={$f(x,y) = x\cdot y$}, height=12cm, width=12cm, z buffer=sort, colorbar, colorbar style={axis lines=box}, colormap name=mathcad, view/h=25, %25 view/v=30, %30 ] \addplot3[surf,shader=interp,mesh/cols=5, opacity=1. 0] coordinates { (0, 0, -0.985379) (0, 1, -5.50572) (0, 2, -7.74578) (0, 3, -4.00693) (0, 4, -0.530504) (1, 0, -5.50572) (1, 1, -30.7627) (1, 2, -43.2789) (1, 3, -22.3884) (1, 4, -2.96415) (2, 0, -7.74578) (2, 1, -43.2789) (2, 2, -60.8873) (2, 3, -31.4973) (2, 4, -4.17014) (3, 0, -4.00693) (3, 1, -22.3884) (3, 2, -31.4973) (3, 3, -16.2937) (3, 4, -2.15723) (4, 0, -0.530504) (4, 1, -2.96415) (4, 2, -4.17014) (4, 3, -2.15723) (4, 4, -0.28561) }; \end{axis} \end{tikzpicture} } \caption{Прочность металлоизделий}\label{ChartsAjFkQrR2} \end{figure} \ \end{document}
Получим вот это:
Для кода:
\documentclass[a4paper,12pt]{report} %%% Кодировки и шрифты %%% \usepackage[T2A]{fontenc} % Поддержка русских букв \usepackage[utf8]{inputenc} % Кодировка utf8 \usepackage[english, russian]{babel} % Языки: русский, английский %%% Цвета %%% \usepackage[usenames]{color} \usepackage{color} %%% Рисование графиков %%% \usepackage{pgfplots} \usepackage{float} \definecolor{plotgrid}{HTML}{ECECEC} % цвет сетки \pgfplotsset{ every axis legend/. append style={at={(0.5,-0.13)},anchor=north,legend cell align=left}, tick label style={font=\tiny\scriptsize}, label style={font=\scriptsize}, legend style={font=\scriptsize}, grid=both, minor tick num=2, major grid style={plotgrid}, minor grid style={plotgrid}, axis lines=left, legend style={draw=none}, /pgf/number format/.cd, 1000 sep={} } % Карта цвета для трехмерных графиков в стиле графиков Mathcad \pgfplotsset{ /pgfplots/colormap={mathcad}{rgb255(0cm)=(76,0,128) rgb255(2cm)=(0,14,147) rgb255(4cm)=(0,173,171) rgb255(6cm)=(32,205,0) rgb255(8cm)=(229,222,0) rgb255(10cm)=(255,13,0)} } % Карта цвета для трехмерных графиков в стиле графиков Matlab \pgfplotsset{ /pgfplots/colormap={matlab}{rgb255(0cm)=(0,0,128) rgb255(1cm)=(0,0,255) rgb255(3cm)=(0,255,255) rgb255(5cm)=(255,255,0) rgb255(7cm)=(255,0,0) rgb255(8cm)=(128,0,0)} } \begin{document} % Вывод графика \begin{figure} [H] \centering { \begin{tikzpicture} \begin{axis}[ xlabel={$x$}, ylabel={$y$}, zlabel={$f(x,y) = x\cdot y$}, height=12cm, width=12cm, z buffer=sort, colorbar, colorbar style={axis lines=box}, colormap name=mathcad, view/h=25, %25 view/v=30, %30 ] \addplot3[surf,shader=faceted,mesh/cols=5, opacity=1.0] coordinates { (0, 0, -0.985379) (0, 1, -5.50572) (0, 2, -7.74578) (0, 3, -4.00693) (0, 4, -0.530504) (1, 0, -5.50572) (1, 1, -30.7627) (1, 2, -43.2789) (1, 3, -22.3884) (1, 4, -2.96415) (2, 0, -7.74578) (2, 1, -43.2789) (2, 2, -60.8873) (2, 3, -31.4973) (2, 4, -4.17014) (3, 0, -4.00693) (3, 1, -22.3884) (3, 2, -31.4973) (3, 3, -16.2937) (3, 4, -2.15723) (4, 0, -0.530504) (4, 1, -2.96415) (4, 2, -4.17014) (4, 3, -2.15723) (4, 4, -0.28561) }; \end{axis} \end{tikzpicture} } \caption{Прочность металлоизделий}\label{ChartsAjFkQrR4} \end{figure} \end{document}
Получим:
Для кода:
\documentclass[a4paper,12pt]{report} %%% Кодировки и шрифты %%% \usepackage[T2A]{fontenc} % Поддержка русских букв \usepackage[utf8]{inputenc} % Кодировка utf8 \usepackage[english, russian]{babel} % Языки: русский, английский %%% Цвета %%% \usepackage[usenames]{color} \usepackage{color} %%% Рисование графиков %%% \usepackage{pgfplots} \usepackage{float} \definecolor{plotgrid}{HTML}{ECECEC} % цвет сетки \pgfplotsset{ every axis legend/. append style={at={(0.5,-0.13)},anchor=north,legend cell align=left}, tick label style={font=\tiny\scriptsize}, label style={font=\scriptsize}, legend style={font=\scriptsize}, grid=both, minor tick num=2, major grid style={plotgrid}, minor grid style={plotgrid}, axis lines=left, legend style={draw=none}, /pgf/number format/.cd, 1000 sep={} } % Карта цвета для трехмерных графиков в стиле графиков Mathcad \pgfplotsset{ /pgfplots/colormap={mathcad}{rgb255(0cm)=(76,0,128) rgb255(2cm)=(0,14,147) rgb255(4cm)=(0,173,171) rgb255(6cm)=(32,205,0) rgb255(8cm)=(229,222,0) rgb255(10cm)=(255,13,0)} } % Карта цвета для трехмерных графиков в стиле графиков Matlab \pgfplotsset{ /pgfplots/colormap={matlab}{rgb255(0cm)=(0,0,128) rgb255(1cm)=(0,0,255) rgb255(3cm)=(0,255,255) rgb255(5cm)=(255,255,0) rgb255(7cm)=(255,0,0) rgb255(8cm)=(128,0,0)} } \begin{document} % Вывод графика \begin{figure} [H] \centering { \begin{tikzpicture} \begin{axis}[ xlabel={$x$}, ylabel={$y$}, zlabel={$f(x,y) = x\cdot y$}, height=12cm, width=12cm, view={0}{90}, z buffer=sort, colorbar, colorbar style={axis lines=box}, grid=none, colormap name=mathcad, ] \addplot3[surf,shader=interp,mesh/cols=5] coordinates { (0, 0, -0.985379) (0, 1, -5.50572) (0, 2, -7.74578) (0, 3, -4.00693) (0, 4, -0.530504) (1, 0, -5.50572) (1, 1, -30.7627) (1, 2, -43.2789) (1, 3, -22.3884) (1, 4, -2.96415) (2, 0, -7.74578) (2, 1, -43.2789) (2, 2, -60.8873) (2, 3, -31.4973) (2, 4, -4.17014) (3, 0, -4.00693) (3, 1, -22.3884) (3, 2, -31.4973) (3, 3, -16.2937) (3, 4, -2.15723) (4, 0, -0.530504) (4, 1, -2.96415) (4, 2, -4.17014) (4, 3, -2.15723) (4, 4, -0.28561) }; \end{axis} \end{tikzpicture} } \caption{Прочность металлоизделий}\label{ChartsAjFkQrR3} \end{figure} \end{document}
Получим вот это:
На код:
\documentclass[a4paper,12pt]{report} %%% Кодировки и шрифты %%% \usepackage[T2A]{fontenc} % Поддержка русских букв \usepackage[utf8]{inputenc} % Кодировка utf8 \usepackage[english, russian]{babel} % Языки: русский, английский %%% Цвета %%% \usepackage[usenames]{color} \usepackage{color} %%% Рисование графиков %%% \usepackage{pgfplots} \usepackage{float} \definecolor{plotgrid}{HTML}{ECECEC} % цвет сетки \pgfplotsset{ every axis legend/.append style={at={(0.5,-0.13)},anchor=north,legend cell align=left}, tick label style={font=\tiny\scriptsize}, label style={font=\scriptsize}, legend style={font=\scriptsize}, grid=both, minor tick num=2, major grid style={plotgrid}, minor grid style={plotgrid}, axis lines=left, legend style={draw=none}, /pgf/number format/.cd, 1000 sep={} } % Карта цвета для трехмерных графиков в стиле графиков Mathcad \pgfplotsset{ /pgfplots/colormap={mathcad}{rgb255(0cm)=(76,0,128) rgb255(2cm)=(0,14,147) rgb255(4cm)=(0,173,171) rgb255(6cm)=(32,205,0) rgb255(8cm)=(229,222,0) rgb255(10cm)=(255,13,0)} } % Карта цвета для трехмерных графиков в стиле графиков Matlab \pgfplotsset{ /pgfplots/colormap={matlab}{rgb255(0cm)=(0,0,128) rgb255(1cm)=(0,0,255) rgb255(3cm)=(0,255,255) rgb255(5cm)=(255,255,0) rgb255(7cm)=(255,0,0) rgb255(8cm)=(128,0,0)} } \begin{document} % Вывод графика \begin{figure} [H] \centering { \begin{tikzpicture} \begin{axis}[ xlabel={$x$}, ylabel={$y$}, zlabel={$f(x,y) = x\cdot y$}, height=12cm, width=12cm, z buffer=sort, colorbar, colorbar style={axis lines=box}, grid=none, colormap name=matlab, ] \addplot3[surf,shader=interp,mesh/cols=5] coordinates { (0, 0, -0. 985379) (0, 1, -5.50572) (0, 2, -7.74578) (0, 3, -4.00693) (0, 4, -0.530504) (1, 0, -5.50572) (1, 1, -30.7627) (1, 2, -43.2789) (1, 3, -22.3884) (1, 4, -2.96415) (2, 0, -7.74578) (2, 1, -43.2789) (2, 2, -60.8873) (2, 3, -31.4973) (2, 4, -4.17014) (3, 0, -4.00693) (3, 1, -22.3884) (3, 2, -31.4973) (3, 3, -16.2937) (3, 4, -2.15723) (4, 0, -0.530504) (4, 1, -2.96415) (4, 2, -4.17014) (4, 3, -2.15723) (4, 4, -0.28561) }; \end{axis} \end{tikzpicture} } \caption{Прочность металлоизделий}\label{ChartsAjFkQrR3} \end{figure} \end{document}
Получим:
Скриншоты более сложных примеров
Примеры от предыдущих отливаются большим количеством точек:
Сравнение с MathCAD
Вот что мы получим в MathCAD на ту же функцию:
А это в LaTeX получили:
Похоже же?
Пример мультипликативной потенциальной функции
Решил привести LaTeX код функции, которая приведена выше:
\documentclass[a4paper,12pt]{report} %%% Кодировки и шрифты %%% \usepackage[T2A]{fontenc} % Поддержка русских букв \usepackage[utf8]{inputenc} % Кодировка utf8 \usepackage[english, russian]{babel} % Языки: русский, английский %%% Цвета %%% \usepackage[usenames]{color} \usepackage{color} %%% Рисование графиков %%% \usepackage{pgfplots} \usepackage{float} \definecolor{plotgrid}{HTML}{ECECEC} % цвет сетки \pgfplotsset{ every axis legend/. append style={at={(0.5,-0.13)},anchor=north,legend cell align=left}, tick label style={font=\tiny\scriptsize}, label style={font=\scriptsize}, legend style={font=\scriptsize}, grid=both, minor tick num=2, major grid style={plotgrid}, minor grid style={plotgrid}, axis lines=left, legend style={draw=none}, /pgf/number format/.cd, 1000 sep={} } % Карта цвета для трехмерных графиков в стиле графиков Mathcad \pgfplotsset{ /pgfplots/colormap={mathcad}{rgb255(0cm)=(76,0,128) rgb255(2cm)=(0,14,147) rgb255(4cm)=(0,173,171) rgb255(6cm)=(32,205,0) rgb255(8cm)=(229,222,0) rgb255(10cm)=(255,13,0)} } % Карта цвета для трехмерных графиков в стиле графиков Matlab \pgfplotsset{ /pgfplots/colormap={matlab}{rgb255(0cm)=(0,0,128) rgb255(1cm)=(0,0,255) rgb255(3cm)=(0,255,255) rgb255(5cm)=(255,255,0) rgb255(7cm)=(255,0,0) rgb255(8cm)=(128,0,0)} } \begin{document} % Вывод графика \begin{figure} [H] \centering { \begin{tikzpicture} \begin{axis}[ xlabel={$x$}, ylabel={$y$}, zlabel={$f(x,y)$}, height=12cm, width=12cm, z buffer=sort, colormap name=mathcad, ] \addplot3[ only marks,scatter, shader=flat, samples=60, domain=0:4,y domain=0:4] {-(-(1/((x-1)*(x-1)+0. 2))-(1/(2*(x-2)*(x-2)+0.15))-(1/(3*(x-3)*(x-3)+0.3)))*(-(1/((y-1)*(y-1)+0.2))-(1/(2*(y-2)*(y-2)+0.15))-(1/(3*(y-3)*(y-3)+0.3)))}; \end{axis} \end{tikzpicture} } \caption{Мультипликативная потенциальная функция}\label{ChartsMultiplicativePotential} \end{figure} \end{document}
Рассказано, как делать 3D графики в LaTeX файлах с помощью пакета pgfplots так, чтобы они были похожи на графики из MathCAD. Мне нравится такая цветовая схема как MathCAD, вот и решил попробовать.
Рассказано, как делать 3D графики в LaTeX файлах с помощью пакета pgfplots так, чтобы они были похожи на графики из MathCAD. Мне нравится такая цветовая схема как MathCAD, вот и решил попробовать.
Как установить matplotlib, структура графиков ~ PythonRu
matplotlib — это библиотека, предназначенная для разработки двумерных графиков (включая 3D-представления). За последнее время она широко распространилась в научных и инженерных кругах (http://matplotlib.org):
Среди всех ее функций особо выделяются следующие:
- Простота в использовании
- Постепенное развитие и интерактивная визуализация данных
- Выражения и текст в LaTeX
- Широкие возможности по контролю графических элементов
- Экспорт в разные форматы, включая PNG, PDF, SVG и EPS
О Matplotlib
matplotlib спроектирована с целью максимально точно воссоздать среду MATLAB в плане графического интерфейса и синтаксической формы. Этот подход оказался успешным, ведь он позволил задействовать особенности уже проверенного ПО (MATLAB), распространив библиотеку в среду технологий и науки. Более того, она включает тот объем работы по оптимизации, который был проделан за много лет. Результат — простота в использовании, что особенно важно для тех, у кого нет опыта работы в этой сфере.
Помимо простоты библиотека matplotlib также унаследовала от MATLAB интерактивность. Это значит, что специалист можно вставлять команду за командой для постепенной разработки графического представления данных. Этот режим отлично подходит для более интерактивных режимов работы с Python, таких как IPython, QtConsole и Jupyter Notebook, предоставляя среду для анализа данных, где есть все, что можно найти, например в Mathematica, IDL или MATLAB.
Гений создателей этой библиотеки в использовании уже доступных, зарекомендовавших себя инструментов из области науки. И это не ограничивается лишь режимом исполнения MATLAB, но также моделями текстового представления научных выражений и символов LaTeX. Благодаря своим возможностям по представлению научных выражений LaTeX был незаменимым элементом научных публикаций и документаций, в которых требуются такие визуальные репрезентации, как интегралы, объединения и производные. А matplotlib интегрирует этот инструмент для улучшения качества отображения.
Не стоит забывать о том, что matplotlib — это не отдельное приложение, а библиотека такого языка программирования, как Python. Поэтому она на полную использует его возможности. Matplotlib воспринимается как графическая библиотека, позволяющая программными средствами настраивать визуальные элементы, из которых состоят графики, и управлять ими. Способность запрограммировать визуальное представление позволяет управлять воспроизводимостью данных в разных средах особенно при изменениях или обновлениях.
А поскольку matplotlib — это библиотека Python, она позволяет на полную использовать потенциал остальных библиотек языка. Чаще всего работе с анализом данных matplotlib взаимодействует с набором других библиотек, таких как NumPy и pandas, но можно добавлять и другие.
Наконец, графическое представление из этой библиотеки можно экспортировать в самые распространенные графические форматы (PNG и SVG) и затем использовать в других приложениях, документах, в сети и так далее.
Установка
Есть много вариантов установки matplotlib. Если это дистрибутив пакетов, такой как Anaconda или Enthought Canopy, то процесс очень простой. Например, используя пакетный менеджер conda
, достаточно ввести следующее:
conda install matplotlib
Если его нужно установить прямо, то команды зависят от операционной системы
В системах Debian-Ubuntu:
sudo apt-get install python-matplotlib
В Fedora-Redhat:
sudo yum install python-matplotlib
В macOS или Windows нужно использовать pip
IPython и IPython QtConsole
Для знакомства со всеми инструментами мира Python часто используют IPython из терминала или QtConsole. Все благодаря тому, что IPython позволяет использовать интерактивность улучшенного терминала и интегрировать графику прямо в консоль.
Для запуска сессии IPython нужно использовать следующую команду:
ipython Python 3.6.3 (default, Oct 15 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)] Type "copyright", "credits" or "license" for more information. IPython 3.6.3 -- An enhanced Interactive Python. Type '?' for help. In [1]:
Если же используется Jupyter QtConsole с возможностью отображения графики вместе с командами, то нужна эта:
jupyter qtconsole
На экране тут же отобразится новое окно с запущенной сессией IPython.
Однако ничто не мешает использовать стандартную сессию Python. Все примеры дальше будут работать и в таком случае.
Архитектура matplotlib
Одна из основных задач, которую выполняет matplotlib — предоставление набора функций и инструментов для представления и управления Figure
(так называется основной объект) вместе со всеми внутренними объектами, из которого он состоит. Но в matplotlib есть также инструменты для обработки событий и, например, анимации. Благодаря им эта библиотека способна создавать интерактивные графики на основе событий по нажатию кнопки или движению мыши.
Архитектура matplotlib логически разделена на три слоя, расположенных на трех уровнях. Коммуникация непрямая — каждый слой может взаимодействовать только с тем, что расположен под ним, но не над.
Вот эти слои:
- Слой сценария
- Художественный слой
- Слой бэкенда
Слой бэкенда
Слой Backend
является нижним на диаграмме с архитектурой всей библиотеки. Он содержит все API и набор классов, отвечающих за реализацию графических элементов на низком уровне.
FigureCanvas
— это объект, олицетворяющий область рисования.Renderer
— объект, который рисует поFigureCanvas
.Event
— объект, обрабатывающий ввод от пользователя (события с клавиатуры и мыши)
Художественный слой
Средним слоем выступает художественный (artist
). Все элементы, составляющие график, такие как название, метки осей, маркеры и так далее, являются экземплярами этого объекта. Каждый из них играет свою роль в иерархической структуре.
Есть два художественных класса: примитивный и составной.
- Примитивный — это объекты, которые представляют собой базовые элементы для формирования графического представления графика, например, Line2D, или геометрические фигуры, такие как прямоугольник круг или даже текст.
- Составные — объекты, состоящие из нескольких базовых (примитивных). Это оси, шкалы и диаграммы.
На этом уровне часто приходится иметь дело с объектами, занимающими высокое положение в иерархии: график, система координат, оси. Поэтому важно полностью понимать, какую роль они играют. Следующее изображение показывает три основных художественных (составных объекта), которые часто используются на этом уровне.
Figure
— объект, занимающий верхнюю позицию в иерархии. Он соответствует всему графическому представлению и может содержать много систем координат.Axes
— это тот самый график. Каждая система координат принадлежит только одному объектуFigure
и имеет два объектаAxis
(или три, если речь идет о трехмерном графике). Другие объекты, такие как название, меткиx
иy
, принадлежат отдельно осям.Axis
учитывает числовые значения в системе координат, определяет пределы и управляет обозначениями на осях, а также соответствующим каждому из них текстом. Положение шкал определяется объектомLocator
, а внешний вид —Formatter
.
Слой сценария (pyplot)
Художественные классы и связанные с ними функции (API matplotlib) подходят всем разработчикам, особенно тем, кто работает с серверами веб-приложений или разрабатывает графические интерфейсы. Но для вычислений, в частности для анализа и визуализации данных, лучше всего подходит слой сценария. Он включает интерфейс pyplot
.
pylab и pyplot
Существуют две библиотеки: pylab
и pyplot
. Но в чем между ними разница? Pylab — это модуль, устанавливаемый вместе с matplotlib, а pyplot
— внутренний модуль matplotlib. На оба часто ссылаются.
from pylab import * # и import matplotlib.pyplot as plt import numpy as np
Pylab объединяет функциональность pyplot
с возможностями NumPy в одном пространстве имен, поэтому отдельно импортировать NumPy не нужно. Более того, при импорте pylab функции из pyplot
и NumPy можно вызывать без ссылки на модуль (пространство имен), что похоже на MATLAB.
plot(x,y) array([1,2,3,4]) # вместо plt.plot() np.array([1,2,3,4]
Пакет pyplot
предлагает классический интерфейс Python для программирования, имеет собственное пространство имеет и требует отдельного импорта NumPy. В последующих материалах используется этот подход. Его же применяет большая часть программистов на Python.
- ТЕГИ
- Data Science
- Matplotib
Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Python Q https://yandex.ru/q/loves/python Online
Python QCEO [email protected]://secure.gravatar.com/avatar/b16f253879f7349f64830c64d1da4415?s=96&d=mm&r=gCEO PythonruPythonАлександрРедакторhttps://t.me/cashncarryhttps://pythonru.com/https://yandex.ru/q/profile/cashnc/[email protected] Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScript(Plots.jl) aspect_ratio=1.0 для 3D-графика — Визуализация
iHany 1
Я не знаю, как установить aspect_ratio=:equal
для трехмерного графика (например, axis_equal
в MATLAB
).
Кажется, что только соотношение сторон осей x
и y
одинаково.
Пример кода
с использованием графиков функциональный тест() Н = 10 xs = диапазон (0, стоп = 10, длина = N) ys = диапазон (0, стоп = 20, длина = N) zs = диапазон (0, стоп = 50, длина = N) р = график (; аспектное_отношение = 1,0) сюжет!(xs, ys, zs) конец тест()
Результат
изображение1184×792 59,7 КБ
rafael.guerra 2
@iHany, см. исправленное улучшенное решение с использованием серверной части gr()
ниже.
с использованием графиков; гр (размер = (600 600)) function plot_iso3d(xs, ys, zs; lw=3, lc=:red, title="Изометрический 3D-график", label=false, camera=(45,30)) # данные состояния для почти изометрического 3D-графика x12, y12, z12 = экстремумы (xs), экстремумы (ys), экстремумы (zs) d = максимум ([diff ([x12. ..]), diff ([y12...]), diff ([z12...])]) [1] / 2 xm, ym, zm = среднее (x12), среднее (y12), среднее (z12) # данные графика p = Plots.plot(; xlabel="x",ylabel="y",zlabel="z", aspect_ratio=:equal, grid=:true) Plots.plot!(xlims=(xm-d,xm+d), ylims=(ym-d,ym+d), zlims=(zm-d,zm+d)) Plots.plot!(;camera=camera) #(азимут,высота) ??? Plots.plot!(xs, ys, zs, title=title,lw=lw,lc=lc,label=label) Plots.plot!(xs, ys, zlims(p)[1].+ 0*zs, lw=1, lc=:светло-серый, label=false) Plots.plot!(xs, ylims(p)[2].+ 0*ys, zs, lw=1, lc=:светло-серый, label=false) Plots.plot!(xlims(p)[1].+ 0*xs, ys, zs, lw=1, lc=:lightgray, label=false) конец #входные данные N = 100 xs = LinRange(0,40,N) ys = LinRange(0,20,N).+ 10*sin.(xs) zs = LinRange(-10,50,N).+ 15*sin.(xs) plot_iso3d (xs, ys, zs)
Isometric_3d_plot_with_shadow600×600 50,4 КБ
2 лайков
gustaphe 3
Небольшое дополнение: одна вещь, которая всегда беспокоила меня при выполнении подобных вещей в Matlab, заключалась в том, что на самом деле это не будет делать то же самое, что и автоматические ограничения оси, потому что он не раскрывает алгоритм расширения пределов.
В Джулии,
plot(x, y; xlims=Plots.widen(xmin, xmax))
избавляет от этой проблемы. Просто немного добавили сахара.
1 Нравится
4
О нет, он лучший? Серьезно?
Работает хорошо, но неудобно
В любом случае, спасибо
rafael.guerra 5
«улучшенный» != лучший
Были связанные вопросы и PR в github и т. Д., Лучшее решение находится в руках разработчиков кода Plots.jl.
NB: Дорога впереди прямая, но уклон крутой…
1 Нравится
rafael.guerra 6
@iHany, обновлен изо-график 3d выше, добавлены теневые проекции.
гелиосдрм 7
Привет, я думаю, что ключевая строка решения @rafael.guerra:
с использованием графиков; гр (размер = (600 600))
По крайней мере, на первый взгляд кажется, что атрибут аспект_ратио=1.0
(или аспект_ратио=:равно
) работает для 3D, но предполагает, что холст фигуры имеет квадратные пропорции, что по умолчанию неверно.
Если вы не хотите сбрасывать размер фигуры по умолчанию, вы также можете установить его для конкретного графика:
plot(x,y,z, aspect_ratio=1.0, size=(600,600))
Рафаэль Гуэрра 8
@heliosdrm, ключевые строки в решении, размещенном выше, лежат сразу под комментарием:
# данные условия для почти изометрического 3D-графика ...
гелиосдрм 9
Может быть, я понимаю что-то другое, чем исходный вопрос @iHany? Я интерпретировал, что проблема заключалась в том, что ось Z в его примере выглядела сплющенной по отношению к осям X и Y, несмотря на установку атрибута aspect_ratio=1.