python 3库,用于以编程方式生成svg图像(矢量图形)并将其呈现或显示在ipython笔记本中。

drawSvg的Python项目详细描述


drawsvg

python 3库,用于以编程方式生成svg图像(矢量图形)并将其呈现或显示在ipython笔记本中。

支持大多数常见的svg标记,通过编写DrawableBasicElementDrawableParentElement的小子类可以轻松添加其他标记。

包含一个交互式的Jupyter notebook小部件drawSvg.widgets.DrawingWidget,它可以基于鼠标事件更新图形。

安装

DrawSVG在PYPI上可用:

$ pip3 install drawSvg

示例

基本绘图元素

importdrawSvgasdrawd=draw.Drawing(200,100,origin='center')d.append(draw.Lines(-80,-45,70,-49,95,49,-90,40,close=False,fill='#eeee00',stroke='black'))d.append(draw.Rectangle(0,0,40,50,fill='#1248ff'))d.append(draw.Circle(-40,-10,30,fill='red',stroke_width=2,stroke='black'))p=draw.Path(stroke_width=2,stroke='green',fill='black',fill_opacity=0.5)p.M(-30,5)# Start path at point (-30, 5)p.l(60,30)# Draw line to (60, 30)p.h(-70)# Draw horizontal line to x=-70p.Z()# Draw line to startd.append(p)d.append(draw.ArcLine(60,-20,20,60,270,stroke='red',stroke_width=5,fill='red',fill_opacity=0.2))d.append(draw.Arc(60,-20,20,60,270,cw=False,stroke='green',stroke_width=3,fill='none'))d.append(draw.Arc(60,-20,20,270,60,cw=True,stroke='blue',stroke_width=1,fill='black',fill_opacity=0.3))d.setPixelScale(2)# Set number of pixels per geometry unit#d.setRenderSize(400,200)  # Alternative to setPixelScaled.saveSvg('example.svg')d.savePng('example.png')# Display in iPython notebookd.rasterize()# Display as PNGd# Display as SVG

Example output image

梯度

importdrawSvgasdrawd=draw.Drawing(1.5,0.8,origin='center')d.draw(draw.Rectangle(-0.75,-0.5,1.5,1,fill='#ddd'))# Create gradientgradient=draw.RadialGradient(0,-0.35,0.7*10)gradient.addStop(0.5/0.7/10,'green',1)gradient.addStop(1/10,'red',0)# Draw a shape to fill with the gradientp=draw.Path(fill=gradient,stroke='black',stroke_width=0.002)p.arc(0,-0.35,0.7,30,120)p.arc(0,-0.35,0.5,120,30,cw=True,includeL=True)p.Z()d.append(p)# Draw another shape to fill with the same gradientp=draw.Path(fill=gradient,stroke='red',stroke_width=0.002)p.arc(0,-0.35,0.75,130,160)p.arc(0,-0.35,0,160,130,cw=True,includeL=True)p.Z()d.append(p)# Another gradientgradient2=draw.LinearGradient(0.1,-0.35,0.1+0.6,-0.35+0.2)gradient2.addStop(0,'green',1)gradient2.addStop(1,'red',0)d.append(draw.Rectangle(0.1,-0.35,0.6,0.2,stroke='black',stroke_width=0.002,fill=gradient2))# Displayd.setRenderSize(w=600)d

Example output image

复制几何体和剪辑路径

importdrawSvgasdrawd=draw.Drawing(1.4,1.4,origin='center')# Define clip pathclip=draw.ClipPath()clip.append(draw.Rectangle(-.25,.25-1,1,1))# Draw a cropped circlec=draw.Circle(0,0,0.5,stroke_width='0.01',stroke='black',fill_opacity=0.3,clip_path=clip,id='circle')d.append(c)# Make a transparent copy, cropped againg=draw.Group(opacity=0.5,clip_path=clip)g.append(draw.Use('circle',0.25,0.1))d.append(g)# Displayd.setRenderSize(400)d.rasterize()

Example output image

实现其他svg标记

importdrawSvgasdraw# Subclass DrawingBasicElement if it cannot have child nodes# Subclass DrawingParentElement otherwise# Subclass DrawingDef if it must go between <def></def> tags in an SVGclassHyperlink(draw.DrawingParentElement):TAG_NAME='a'def__init__(self,href,target=None,**kwargs):# Other init logic...# Keyword arguments to super().__init__() correspond to SVG node# arguments: stroke_width=5 -> stroke-width="5"super().__init__(href=href,target=target,**kwargs)d=draw.Drawing(1,1.2,origin='center')# Create hyperlinkhlink=Hyperlink('https://www.python.org',target='_blank',transform='skewY(-30)')# Add child elementshlink.append(draw.Circle(0,0,0.5,fill='green'))hlink.append(draw.Text('Hyperlink',0.2,0,0,center=0.6,fill='white'))# Draw and displayd.append(hlink)d.setRenderSize(200)d

Example output image

交互式小部件

importdrawSvgasdrawfromdrawSvg.widgetsimportDrawingWidgetimporthyperbolic.poincare.shapesashyper# pip3 install hyperbolic# Create drawingd=draw.Drawing(2,2,origin='center')d.setRenderSize(500)d.append(draw.Circle(0,0,1,fill='orange'))group=draw.Group()d.append(group)# Update the drawing based on user inputclick_list=[]defredraw(points):group.children.clear()forx1,y1inpoints:forx2,y2inpoints:if(x1,y1)==(x2,y2):continuep1=hyper.Point.fromEuclid(x1,y1)p2=hyper.Point.fromEuclid(x2,y2)ifp1.distanceTo(p2)<=2:line=hyper.Line.fromPoints(*p1,*p2,segment=True)group.draw(line,hwidth=0.2,fill='white')forx,yinpoints:p=hyper.Point.fromEuclid(x,y)group.draw(hyper.Circle.fromCenterRadius(p,0.1),fill='green')redraw(click_list)# Create interactive widget and register mouse eventswidget=DrawingWidget(d)@widget.mousedowndefmousedown(widget,x,y,info):if(x**2+y**2)**0.5+1e-5<1:click_list.append((x,y))redraw(click_list)widget.refresh()@widget.mousemovedefmousemove(widget,x,y,info):if(x**2+y**2)**0.5+1e-5<1:redraw(click_list+[(x,y)])widget.refresh()widget

Example output image

动画

importdrawSvgasdraw# Draw a frame of the animationdefdraw_frame(t):d=draw.Drawing(2,6.05,origin=(-1,-1.05))d.setRenderSize(h=300)d.append(draw.Rectangle(-2,-2,4,8,fill='white'))d.append(draw.Rectangle(-1,-1.05,2,0.05,fill='brown'))t=(t+1)%2-1y=4-t**2*4d.append(draw.Circle(0,y,1,fill='lime'))returndwithdraw.animate_jupyter(draw_frame,delay=0.05)asanim:# Or:#with draw.animate_video('example6.gif', draw_frame, duration=0.05#                       ) as anim:# Add each frame to the animationforiinrange(20):anim.draw_frame(i/10)foriinrange(20):anim.draw_frame(i/10)foriinrange(20):anim.draw_frame(i/10)

Example output image

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在Microsoft Office Word或Excel文档中查找突出显示的文本   Java反射:获取方法返回参数的类型   java根据从字符串解析的日期对ArrayList<String>进行排序   不带IDE JSONObject的json JAVA   Selenium检查属性是否包含java中字符串的一部分   java Hibernate在使用@PostConstruct时找不到绑定到线程的会话   java频繁访问对象属性会带来成本吗?   java如何使用spring boot从json更新数据   Android Studio中的java适当边距布局   java spring引导无法在spring测试类中注入spring服务   java在插入排序中删除重复项   如何在JAVA中重写异常类方法   java Guava缓存内存泄漏   多线程处理三个必须并行执行的任务completableFuture,如果其中任何一个在java中引发异常,则全部取消