Използване на библиотеката matplotlib
Софтуер, източници и снимки
Matplotlib версия 0.99 най-накрая има способността да рисува 3D графики в допълнение към 2D графики. Лично за мен аналогът на сърф функцията от Matlab особено липсваше. В тази статия ще разберем как можете да начертаете 3D графики на функция (повърхност) и какви настройки за външния вид съществуват.
За да изпълним примерите, се нуждаем от версия на Matplotlib поне 0.99, която може да бъде изтеглена тук. Когато писах тази статия, използвах версия 0.99.1.
Освен това ще ни е необходима математическата библиотека numpy, тъй като някои методи за изчертаване на класове с триизмерна графика очакват екземпляри на класа numpy.array като параметри, а самата библиотека Numpy може значително да намали броя на редовете код.
Първа 3D диаграма
Всички класове за работа с триизмерни графики са в пакета mpl_toolkits.mplot3d, от който ще трябва да бъдат импортирани.
За да начертаете 3D графика, първо трябва да създадете 3D оси. За да ги създадете, трябва да създадете екземпляр на класа mpl_toolkits.mplot3d.Axes3D, чийто конструктор очаква поне един параметър – екземпляр на класа matplotlib.figure.Figure, който от своя страна може да бъде създаден чрез извикване на pylab.figure(). Конструкторът на класа matplotlib.figure.Figure има и други незадължителни параметри, но засега няма да ги използваме. Нека начертаем празни оси:
импортирайте pylab от mpl_toolkits. mplot3d импортира Axes3D
смокиня = pylab. фигура ( ) Axes3D ( фиг. )
В резултат на това ще видим следния прозорец:

Можете да завъртите получените оси с мишката.
Време е да нарисувате нещотриизмерни в получените оси. За всички примери ще използваме следната функция, от две координати.
Първо трябва да подготвите данните за чертане. Ще ни трябват три двумерни матрици: матриците X и Y ще съхраняват координатите на мрежата от точки, в които ще бъде изчислена горната функция, а Z матрицата ще съхранява стойностите на тази функция в съответната точка.
Ако искаме да начертаем 3D графика върху равноотдалечена мрежа (върху мрежа, която има същото разстояние между точките), тогава функцията meshgrid() от библиотеката numpy ще помогне да се създадат матрици, които ще съхраняват координати. Тази функция създава двумерни мрежови матрици от едномерни масиви. Работата на тази функция е много ясно показана в документацията за numpy:
Сега можем да намерим реалните координати от индекса на възела на мрежата: X[0][0] = 1, Y[0][0] = 4 и т.н.
За да отделим подготовката на данни от самия чертеж, отделяме създаването на мрежата и изчисляването на функцията в отделна функция:
def makeData (): # Изграждаме мрежа в диапазона от -10 до 10 със стъпка от 0,1 за двете координати x = numpy. arange (-10, 10, 0,1) y = numpy. диапазон (-10, 10, 0,1)
# Създаване на 2D мрежова матрица xgr >, ygr >= numpy. мрежа (x, y)
# Във възлите изчисляваме стойността на функцията zgr >= numpy. sin ( xgr >) * numpy. sin ( ygr >) / ( xgr >) връщане xgr >, ygr >, zgrid
Тази функция връща три двумерни матрици: x, y, z. Координатите x и y са между -10 и 10 на стъпки от 0,1.
Сега се връщаме директно към рисуването. За да изведем нашите данни е достатъчно да извикаме метода plot_surface() на екземпляр от класа Axes3D, в който ще предадем двумерните матрици, получени с помощта на функцията makeData().
Сега нашатапример изглежда така:
импортирайте pylab от mpl_toolkits. mplot3d import Axes3D import numpy
def makeData() : x = numpy. arange (-10, 10, 0,1) y = numpy. оранжево (-10, 10, 0,1) xgr >, ygr >= numpy. мрежа (x, y)
zgr >= numpy. sin ( xgr >) * numpy. sin ( ygr >) / ( xgr >) връщане xgr >, ygr >, zgrid
x, y, z = makeData ()
смокиня = pylab. фигура ( ) оси = Axes3D ( фиг. )
брадви. plot_surface (x, y, z)
Ако стартираме този скрипт, ще се появи прозорец със следното синьо кратко:

Полученото парче може да се върти с мишката. Matplotlib не използва графичен ускорител, така че въртенето е доста бавно, въпреки че скоростта зависи от броя на точките на повърхността.


В допълнение към изброените параметри, методът plot_surface() има допълнителни параметри, които сега ще разгледаме.
Променете външния вид на диаграмата
Помислете за останалите параметри на метода Axes3D.plot_surface(X, Y, Z, *args, **kwargs), не са много от тях:
- X, Y и Z вече сме използвали - тези параметри задават мрежата и стойността на функцията във възли.
Нека поиграем с всяка от тези опции.
Първо, нека видим как параметрите rstride и cstride влияят на външния вид. Нека променим реда в предишния пример, като използваме метода plot_surface(), както следва:
В резултат на това ще получим по-фина мрежа на диаграмата:

Ако зададете стойностите на тези параметри на 20 по същия начин, тогава мрежата ще бъде, напротив, по-голяма:

Промяна на цвета
Сега нека променим цвета на повърхността с помощта на цветния параметър. Този параметър е низ, койтоописва цвета. Цветният низ може да бъде определен по различни начини:
Цветът може да бъде определен от английската дума за съответния цвят или от една буква. Няма много такива цветя:
- "b" или "синьо"
- "g" или "зелено"
- "r" или "червено"
- "c" или "cyan"
- 'm' или 'magenta'
- 'y' или 'yellow'
- "k" или "черно"
- "w" или "бяло"
Например, нека направим повърхността жълта:

Можем да постигнем същия резултат, като използваме следния ред:
Ако имаме нужда от сив цвят, тогава можем да зададем яркостта му с помощта на низ, съдържащ число в диапазона от 0.0 до 1.0 (0 - бяло, 1 - черно). Например, можем да напишем следния ред:
В този случай ще видим такава сива графика:

Освен това можем да зададем цвета, както е обичайно в HTML след знака за паунд ('#'). Например, можем да зададем цвета, както следва:
След това графиката става зелена:

Използване на цветни карти (colormap)
Цветните карти се използват, ако трябва да посочите кои цветове да се използват за боядисване на части от триизмерна повърхност в зависимост от Z стойността в тази област (задаване на цветен градиент). Темата за използването на градиенти е голяма и интересна сама по себе си, но засега ще разгледаме само някои от нейните аспекти. За да използвате градиент при чертане, трябва да предадете екземпляр на класа matplotlib.colors.Colormap или негов производен като стойност на параметъра cmap (от думата colormap, цветна карта).
Следващият пример използва класа LinearSegmentedColormap, който произлиза от Colormap, за създаване на градиент от синьо към червено през бяло.
импортирайте pylab от mpl_toolkits. mplot3d импортира Axes3D от matplotlib. цветове импортиране LinearSegmentedColormap импортиране на numpy
def makeData() : x = numpy. arange (-10, 10, 0,1) y = numpy. оранжево (-10, 10, 0,1) xgr >, ygr >= numpy. мрежа (x, y)
zgr >= numpy. sin ( xgr >) * numpy. sin ( ygr >) / ( xgr >) връщане xgr >, ygr >, zgrid
x, y, z = makeData ()
смокиня = pylab. фигура ( ) оси = Axes3D ( фиг. )
брадви. plot_surface (x, y, z, rstr >= 3, cstr >= 3, cmap = LinearSegmentedColormap. from_list ("red_blue", ['b', 'w', 'r' ], 256))
Тук се използва статичният метод from_list(), който приема три параметъра:
- Името на генерираната карта
Ако не искате всеки път да създавате собствена цветна карта, тогава можете да използвате една от готовите карти, които се намират в модула matplotlib.cm.
За да разберете какви цветни карти съществуват, можете просто да прочетете променливата cm._cmapnames, която е списък от низове:
от matplotlib import cm
Във версията на Matplotlib, която инсталирах (0.99.1), следните цветови карти бяха показани в конзолата:
Спектрален, меден, RdYlGn, Set2, лято, пролет, Акцент, OrRd, RdBu, есен, Set1, PuBu, Set3, gist_rainbow, розово, двоичен, зимен, реактивен, BuPu, Dark2, призма, Портокали, gist_yarg, BuGn, горещ, PiYG, YlOrBr, Червени, спектрален, RdPu, Зелени, същност _ncar, PRGn, gist_heat, Y lGnBu, RdYlBu, Paired, flag, hsv, BrBG, Purples, cool, Pastel2, gray, Pastel1, gist_stern, GnBu, YlGn, Greys, RdGy, YlOrRd, PuOr, PuRd, gist_gray, Blues, PuBuGn, gist_earth, bo не
Няма смисъл да ги разглеждаме всички, само за пример, нека използваме някои от тях:
импортирайте pylab от mpl_toolkits. mplot3d импортира Axes3D отmatplotlib. цветове импортиране LinearSegmentedColormap от matplotlib импортиране cm импортиране numpy
def makeData() : x = numpy. arange (-10, 10, 0,1) y = numpy. оранжево (-10, 10, 0,1) xgr >, ygr >= numpy. мрежа (x, y)
zgr >= numpy. sin ( xgr >) * numpy. sin ( ygr >) / ( xgr >) връщане xgr >, ygr >, zgrid
x, y, z = makeData ()
смокиня = pylab. фигура ( ) оси = Axes3D ( фиг. )
брадви. plot_surface (x, y, z, rstr >= 4, cstr >= 4, cmap = cm. струя)
Картата cm.jet е може би най-използваната карта в примерите.

Моля, обърнете внимание, че не предаваме низ като аргумент на cmap, а име на променлива от cm модула и това е вече създаден клас, а не име на клас. Така, например, cm.jet е екземпляр на класа matplotlib.colors.LinearSegmentedColormap.
Например цветната карта cm.Spectral изглежда така:

Това е мястото, където прекъсваме. В допълнение към чертането на 3D повърхности в Matplotlib е възможно да се рисуват точки и линии в 3D пространство, 3D хистограми и равнинни фигури в 3D пространство. Но сега няма да разглеждаме други видове графики, не изключвам, че ще има други статии за Matplotlib.