Графикларда чизиқлар ва геометрик фигуралар яратиш
Matplotlib turli xil geometrik shakllar, strelkalar, shuningdek chiziqlarni turli usullar bilan chizish imkonini beradi. Masalan, quyidagi rasmni oladigan skriptni ko'rib chiqamiz:
Grafikadagi barcha geometrik jismlar bir necha bosqichda chizilgan. Avval siz joriy jadvalga bog'langan o'qni (yoki yaratishingiz) olishingiz kerak. Bu pylab.gca () funktsiyasi yordamida amalga oshiriladi. Ushbu funktsiya matplotlib.axes.Axes-dan olingan klassni qaytaradi, bizning misolimizda AxesSubplot klassi bo'ladi.
Shundan so'ng, siz ko'p geometrik shakllar uchun matplotlib.patches modulida joylashgan geometrik shakl ob'ektini yaratishingiz kerak, ammo Line2D chizig'i klassi matplotlib.lines modulida mavjud. Shu bilan birga, xuddi shu geometrik shakllar pylab moduli yordamida yaratilishi mumkin, ular quyida muhokama qilinadi, lekin biz boshlash uchun matplotlib.patches va matplotlib.lines modullaridan foydalanamiz.
Geometrik shakl ob'ekti yaratilgandan so'ng, biz uni aksariyat geometrik shakllar uchun add_patch () usuli yoki Line2D klassi misolida add_line () usuli yordamida qo'shishimiz kerak.
Ushbu misolda yaratilgan har bir ob'ektni batafsil ko'rib chiqmaymiz, ular etarli darajada ko'p parametrlarga ega bo'lishi mumkin, ushbu maqolada biz juda mantiqiy ko'rinmaydigan yoki osongina unutilishi mumkin bo'lgan ba'zi xususiyatlarga e'tibor qaratamiz.
Aniqlik uchun, ushbu misolda har bir ob'ekt turini chizish alohida funktsiya sifatida olinadi. Birinchidan, keling, ushbu misolning to'liq kodini ko'rib chiqamiz va keyin ba'zi ob'ektlarning xususiyatlarini ko'rib chiqamiz.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pylab
import matplotlib.patches
import matplotlib.lines
import matplotlib.path
def drawLine (axes):
"""
Рисование линии
"""
x0 = 0
y0 = 0
x1 = 1
y1 = 0.5
x2 = 0.5
y2 = 1.0
line = matplotlib.lines.Line2D ([x0, x1, x2], [y0, y1, y2], color="k")
axes.add_line (line)
pylab.text (0.5, 1.1, "Line2D", horizontalalignment="center")
def drawCircles (axes):
"""
Рисование окружностей
"""
circle1 = matplotlib.patches.Circle((0, 0), radius=0.1, fill=True)
axes.add_patch (circle1)
pylab.text (0, 0.2, "Circle", horizontalalignment="center")
circle2 = matplotlib.patches.Circle((0, 0), radius=1.5, fill=False, color="r")
axes.add_patch (circle2)
pylab.text (0, 1.55, "Circle", horizontalalignment="center")
def drawArrow (axes):
"""
Рисование стрелки
"""
arrow_x0 = -1.0
arrow_y0 = 0.5
arrow_dx = 1
arrow_dy = 0.5
arrow = matplotlib.patches.Arrow (arrow_x0, arrow_y0, arrow_dx,arrow_dy,
width=0.2, color="g")
axes.add_patch (arrow)
pylab.text (-0.5, 1.0, "Arrow", horizontalalignment="center")
def drawArc (axes):
"""
Рисование дуги
"""
arc_x = 0
arc_y = 0
arc_width = 1
arc_height = 1
arc_theta1 = 270
arc_theta2 = 360
arc = matplotlib.patches.Arc ((arc_x, arc_y),
arc_width,
arc_height,
theta1 = arc_theta1,
theta2 = arc_theta2)
axes.add_patch (arc)
pylab.text (0.6, -0.3, "Arc", horizontalalignment="center")
def drawPolygons (axes):
"""
Рисование многоугольника
"""
polygon_1 = matplotlib.patches.Polygon ([(0, -0.75),
(0, -1.25),
(0.5, -1.25),
(1, -0.75)])
axes.add_patch (polygon_1)
pylab.text (0.6, -0.7, "Polygon", horizontalalignment="center")
polygon_2 = matplotlib.patches.Polygon ([(-0.5, 0),
(-1, -0.5),
(-1, -1),
(-0.5, -1)],
fill = False,
closed = False)
axes.add_patch (polygon_2)
pylab.text (-1.0, -0.1, "Polygon", horizontalalignment="center")
def drawRect (axes):
"""
Рисование повернутого прямоугольника
"""
rect_coord = (-1.5, 1)
rect_width = 0.5
rect_height = 0.3
rect_angle = 30
rect = matplotlib.patches.Rectangle (rect_coord,
rect_width,
rect_height,
rect_angle,
color="g")
axes.add_patch (rect)
pylab.text (-1.5, 1.5, "Rect", horizontalalignment="center")
def drawPath (axes):
vertices = [(1.0, -1.75), (1.5, -1.5), (1.5, -1.0), (1.75, -0.75)]
codes = [matplotlib.path.Path.MOVETO,
matplotlib.path.Path.LINETO,
matplotlib.path.Path.LINETO,
matplotlib.path.Path.LINETO,
]
path = matplotlib.patches.Path (vertices, codes)
path_patch = matplotlib.patches.PathPatch (path, fill=False)
axes.add_patch (path_patch)
pylab.text (1.5, -1.75, "Path", horizontalalignment="center")
if __name__ == "__main__":
pylab.xlim (-2, 2)
pylab.ylim (-2, 2)
pylab.grid()
axes = pylab.gca()
axes.set_aspect("equal")
drawLine (axes)
drawPolygons (axes)
drawPath (axes)
drawRect (axes)
drawCircles (axes)
drawArc (axes)
drawArrow (axes)
pylab.show()
Misolni tahlil qilishni chiziqlar chizishdan boshlaylik.
def drawLine (axes):
"""
Рисование линии
"""
x0 = 0
y0 = 0
x1 = 1
y1 = 0.5
x2 = 0.5
y2 = 1.0
line = matplotlib.lines.Line2D ([x0, x1, x2], [y0, y1, y2], color="k")
axes.add_line (line)
pylab.text (0.5, 1.1, "Line2D", horizontalalignment="center")
Ushbu geometrik shakl boshqalardan ajralib turadi, chunki uning klassi matplotlib.lines modulida joylashgan va siz Axes.add_line () usuli yordamida qo'shishingiz kerak. Bundan tashqari, koordinatalar qanday o'rnatilishiga e'tibor bering. Birinchi parametr X o'qi bo'ylab koordinatalar ro'yxatini, ikkinchisi Y o'qi bo'ylab koordinatalar ro'yxatini o'rnatadi, boshqa nomlangan parametrlar tashqi ko'rinishini belgilashi mumkin.
Chiziqlar ko'pburchak (Poligon klassi) yordamida ham chizilishi mumkin, lekin siz ko'pburchak yopilmaganligini ko'rsatishingiz kerak (Poligon konstruktoridagi yopiq parametr False bo'lishi kerak) va to'ldiruvchidan foydalanishingiz shart emas (Poligon konstruktoridagi to'ldirish parametri noto'g'ri bo'lishi kerak). Ushbu misolda drawPolygons funktsiyasi to'ldirilgan va to'ldirilmagan ko'pburchaklarni tortadi. Ikkinchisi yopiq emas, shuning uchun uning ko'rinishi Line2D klassi yordamida chizilgan chiziqqa o'xshaydi:
def drawPolygons (axes):
"""
Рисование многоугольника
"""
polygon_1 = matplotlib.patches.Polygon ([(0, -0.75),
(0, -1.25),
(0.5, -1.25),
(1, -0.75)])
axes.add_patch (polygon_1)
pylab.text (0.6, -0.7, "Polygon", horizontalalignment="center")
polygon_2 = matplotlib.patches.Polygon ([(-0.5, 0),
(-1, -0.5),
(-1, -1),
(-0.5, -1)],
fill = False,
closed = False)
axes.add_patch (polygon_2)
pylab.text (-1.0, -0.1, "Polygon", horizontalalignment="center")
Birinchi parametr sifatida Poligon sinfining konstruktori, Line2D sinfining konstruktoridan farqli o'laroq, koordinatalarni (x, y) belgilaydigan ikki elementli ro'yxatlar yoki tutqichlardan tashkil topgan ro'yxatni qabul qiladi.
Bundan tashqari, (PathPatch) deb nomlangan yo'llar yordamida chiziqlar chizish mumkin.
def drawPath (axes):
vertices = [(1.0, -1.75), (1.5, -1.5), (1.5, -1.0), (1.75, -0.75)]
codes = [matplotlib.path.Path.MOVETO,
matplotlib.path.Path.LINETO,
matplotlib.path.Path.LINETO,
matplotlib.path.Path.LINETO,
]
path = matplotlib.patches.Path (vertices, codes)
path_patch = matplotlib.patches.PathPatch (path, fill=False)
axes.add_patch (path_patch)
pylab.text (1.5, -1.75, "Path", horizontalalignment="center")
PathPatch klassi yordamida chizish bir necha bosqichdan iborat. Birinchidan, nazorat punktlarining ro'yxati tuziladi. Poligon sinfida bo'lgani kabi, bu koordinatalarni (x, y) belgilaydigan ikki elementli ro'yxatlar yoki bog'lamlar ro'yxati.
Keyin matplotlib.path.Path klassining namunasini yaratishingiz kerak, bunda konstruktor ikkita zarur parametrlarni oladi: uchlari va bu uchlari bilan nima qilish kerakligini aniqlaydigan kodlar ro'yxati. Kod raqamlari Path sinfining a'zolari. Ular MOVETO (chiziqsiz bir nuqtaga o'tish), LINETO (berilgan nuqtaga chiziq chizish), CURVE3, CURVE4 (mos ravishda ikkinchi va uchinchi darajali Bezier egri chizig'ini chizish uchun) va CLOSEPOLY (boshlang'ich nuqtaga yo'lni yopish uchun ishlatiladi) qiymatlarini olishlari mumkin.
Ushbu misolda ushbu sinf yordamida bitta singan chiziq chizilgan, ammo printsipial ravishda bir xil klassdan foydalanib siz tekis chiziqlar - kvadratik va kubik Bezier egri chiziqlarini chizishingiz mumkin.
Chiziqlar Ark sinfidan foydalanib chizilgan yoylarni ham o'z ichiga olishi mumkin.
def drawArc (axes):
"""
Рисование дуги
"""
arc_x = 0
arc_y = 0
arc_width = 1
arc_height = 1
arc_theta1 = 270
arc_theta2 = 360
arc = matplotlib.patches.Arc ((arc_x, arc_y),
arc_width,
arc_height,
theta1 = arc_theta1,
theta2 = arc_theta2)
axes.add_patch (arc)
pylab.text (0.6, -0.3, "Arc", horizontalalignment="center")
Arkni chizish oson, shunchaki matplotlib.patches.Arc sinfining namunasini yarating va add_patch usulidan foydalanib uni o'z o'qlariga qo'shing. Ark sinfining konstruktori uchta zarur parametrni oladi: yoy ellipsining markazini koordinatalarini o'rnatadigan va ellipsni bog'laydigan to'rtburchaklar kengligi va balandligi. Ark yoyi chizilgan sektorni belgilash uchun, tea1 va teta2 parametrlari ishlatiladi, ular mos ravishda yoyning boshi va oxirining burchaklarini belgilaydilar. Bundan tashqari, ellipsni o'zboshimchalik bilan burish mumkin, buning uchun siz qo'shimcha parametr burchagini (shuningdek, darajalarda) o'tishingiz kerak
Qolgan geometrik shakllarni misoldan chizish juda tushunarli, u erda hech qanday xususiyat yo'q, shuning uchun biz ularga alohida to'xtalmaymiz. Malumot uchun biz matplotlib.patches modulida joylashgan geometrik shakllar sinflarini ro'yxatlaymiz.
• Ark - kamonni chizish.
• Ok - o'qni torting. (shuningdek, bir xil modulda ConnectionPatch, FancyArrowPatch va FancyArrow-ga qarang)
• Circle - doira chizish.
• CirclePolygon - teng tomonli ko'pburchaklarni chizish (shuningdek RegularPolygon-ga qarang).
• Ellips - ellipsni chizish.
• FancyBboxPatch - "ekzotik" to'rtburchaklar chizish (burchak shaklida, o'q shaklida, qirrali qirralari va boshqalar).
• PathPatch - chiziq yoki yopiq joyni chizish.
• Ko'pburchak - ko'pburchak chizish.
• To'rtburchak - to'rtburchaklar chizish.
• Nikoh - "xanjar" chizish (aylana sektori).
Bizning misolimizda biz ob'ektlarni yaratish uchun matplotlib.patches modulidan foydalanganmiz, ammo bu ob'ektlarning ko'pini (lekin ba'zi sabablarga ko'ra hammasi emas) pyllab moduli yordamida yaratish mumkin. Bizning misolimiz quyidagicha qayta yozilishi mumkin:
Do'stlaringiz bilan baham: |