1. import matplotlib.pyplot as plt
  2. from matplotlib.path import Path
  3. import matplotlib.patches as patches

Path 通过一个(N, 2)的包含(x, y)的点来实例比如,我们想要画一个标准的正方形:

  1. verts = [
  2. (0., 0.), # left, bottom
  3. (0., 1.), # left, top
  4. (1., 1.), # right, top
  5. (1., 0.), # right, bottom
  6. (0., 0.), # ignored
  7. ]
  8. codes = [
  9. Path.MOVETO,
  10. Path.LINETO,
  11. Path.LINETO,
  12. Path.LINETO,
  13. Path.LINETO,
  14. ]
  15. path = Path(verts, codes)
  16. fig, ax = plt.subplots(figsize=(5, 5))
  17. patch = patches.PathPatch(path, facecolor='orange', lw=2)
  18. ax.add_patch(patch)
  19. ax.set_xlim(-2, 2)
  20. ax.set_ylim(-2, 2)
  21. plt.show()

注意到,上面的codes包含了一些path的种类:

STOP: 标志着整个path的结束

MOVETO: 提起笔,移动到当前给定的位置 path的第一个点必须是MOVETO 表示提起笔?

LINETO: 画一条从当前位置到给定点的直线

CURVE3: 需要给定一个控制点和一个结束点 画一个二次Bézier曲线,利用控制点到结束点

CURVE4: 需要给定俩个控制点和一个街书店, 画一个三次Beier曲线, 利用给定的控制点到结束点

Bezier example

有些path需要多个点来确定,比如上面的CURVE3要2个点CURVE4需要3个点

  1. verts = [
  2. (0., 0.), # P0
  3. (0.2, 1.), # P1
  4. (1., 0.8), # P2
  5. (0.8, 0.), # P3
  6. ]
  7. codes = [
  8. Path.MOVETO,
  9. Path.CURVE4, #我们看到CURVE4占了3个点
  10. Path.CURVE4,
  11. Path.CURVE4,
  12. ]
  13. path = Path(verts, codes)
  14. fig, ax = plt.subplots()
  15. patch = patches.PathPatch(path, facecolor='none', lw=2)
  16. ax.add_patch(patch)
  17. xs, ys = zip(*verts)
  18. ax.plot(xs, ys, 'x--', lw=2, color='black', ms=10)
  19. ax.text(-0.05, -0.05, 'P0')
  20. ax.text(0.15, 1.05, 'P1')
  21. ax.text(1.05, 0.85, 'P2')
  22. ax.text(0.85, -0.05, 'P3')
  23. ax.set_xlim(-0.1, 1.1)
  24. ax.set_ylim(-0.1, 1.1)
  25. plt.show()

用path来画柱状图

matplotlib里面的很多元素,比如hist, bar等都是以path为图元的

  1. import numpy as np
  2. nrects = 100
  3. data = np.random.randn(1000)
  4. n, bins = np.histogram(data, nrects) # n每个bin的个数, bins位置
  1. left = np.array(bins[:-1]) #矩形的左边位置
  2. right = np.array(bins[1:]) #矩形的右边位置
  3. bottom = np.zeros(nrects) #下
  4. top = bottom + n #上

接下来,我们来构建柱状体,每个柱子需要5个点,一个MOVETO,三个LINETO,一个CLOSEPOLY

  1. nverts = nrects*(1+3+1)
  2. verts = np.zeros((nverts, 2)) #构建nevrts * 2 的数组
  3. codes = np.ones(nverts, int) * Path.LINETO #LINETO == 2
  4. codes[0::5] = Path.MOVETO #每隔五步是一个新的起点 MOVETO == 1
  5. codes[4::5] = Path.CLOSEPOLY #同样有一个终点 CLOSEPOLY == 79
  6. verts[0::5,0] = left #下面都是设置起始位置
  7. verts[0::5,1] = bottom
  8. verts[1::5,0] = left
  9. verts[1::5,1] = top
  10. verts[2::5,0] = right
  11. verts[2::5,1] = top
  12. verts[3::5,0] = right
  13. verts[3::5,1] = bottom
  1. barpath = Path(verts, codes)
  2. patch = patches.PathPatch(barpath, facecolor='green',
  3. edgecolor='yellow', alpha=0.5)
  4. fig, ax = plt.subplots()
  5. ax.add_patch(patch)
  6. ax.set_xlim(left[0], right[-1]) #坐标不会自动调整,需要自己设定
  7. ax.set_ylim(bottom.min(), top.max())
  8. plt.show()

随便玩玩

  1. verts = [
  2. (1, 0),
  3. (0, 1),
  4. (2, 2),
  5. (3, 3.5),
  6. (4, 3.2),
  7. (3.6, 0)
  8. ]
  9. codes = [
  10. Path.MOVETO,
  11. Path.CURVE3,
  12. Path.CURVE3,
  13. Path.CURVE4,
  14. Path.CURVE4,
  15. Path.CURVE4
  16. ]
  17. linepath = Path(verts, codes)
  18. pathce = patches.PathPatch(linepath, facecolor="yellow", edgecolor="red")
  19. fig, ax = plt.subplots()
  20. ax.add_patch(pathce)
  21. ax.set_xlim(0, 5)
  22. ax.set_ylim(0, 4)
  23. plt.show()

  1. verts = [
  2. (0, 0),
  3. (0, 2.7),
  4. (-0.8, 2),
  5. (0.8, 2),
  6. (-0.3, 2.7),
  7. (0.3, 2.7),
  8. (-0.4, 4.1),
  9. (0.4, 4.1),
  10. (-0.35, 3.4),
  11. (0.35, 3.4),
  12. (-0.3, 2.7),
  13. (-0.4, 4.1),
  14. (0.3, 2.7),
  15. (0.4, 4.1)
  16. ]
  17. codes = [
  18. Path.MOVETO,
  19. Path.LINETO,
  20. Path.MOVETO,
  21. Path.LINETO,
  22. Path.MOVETO,
  23. Path.LINETO,
  24. Path.MOVETO,
  25. Path.LINETO,
  26. Path.MOVETO,
  27. Path.LINETO,
  28. Path.MOVETO,
  29. Path.LINETO,
  30. Path.MOVETO,
  31. Path.LINETO
  32. ]
  33. zaopath = Path(verts, codes)
  34. patch = patches.PathPatch(zaopath, edgecolor="blue")
  35. fig, ax = plt.subplots()
  36. ax.add_patch(patch)
  37. ax.set_xlim(-1, 1)
  38. ax.set_ylim(-1, 5)
  39. plt.show()

matplotlib 高阶之path tutorial的更多相关文章

  1. matplotlib 高阶之Transformations Tutorial

    目录 Data coordinates Axes coordinates Blended transformations 混合坐标系统 plotting in physical units 使用off ...

  2. matplotlib 高阶之patheffect (阴影,强调)

    目录 添加阴影 使Artist变得突出 更多效果 我们可以通过path来修饰Artist, 通过set_path_effects import matplotlib.pyplot as plt imp ...

  3. 迈向高阶:优秀Android程序员必知必会的网络基础

    1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...

  4. Jackson 框架的高阶应用

    Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架.Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson ...

  5. 高阶函数 - Higher Order Function

    一个函数如果有 参数是函数 或 返回值是函数,就称为高阶函数. 这篇文章介绍高阶函数的一个子集:输入 fn,输出 fn'. 按 fn 与 fn' 功能是否一致,即相同输入是否始终对应相同输出,把这类高 ...

  6. python开发基础04-函数、递归、匿名函数、高阶函数、装饰器

    匿名函数 lamba lambda x,y,z=1:x+y+z 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函 ...

  7. 《React后台管理系统实战 :一》:目录结构、引入antd、引入路由、写login页面、使用antd的form登录组件、form前台验证、高阶函数/组件

    实战 上接,笔记:https://blog.csdn.net/u010132177/article/details/104150177 https://gitee.com/pasaulis/react ...

  8. 利用 React 高阶组件实现一个面包屑导航

    什么是 React 高阶组件 React 高阶组件就是以高阶函数的方式包裹需要修饰的 React 组件,并返回处理完成后的 React 组件.React 高阶组件在 React 生态中使用的非常频繁, ...

  9. ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法

    NuGet包"Microsoft.AspNetCore.Diagnostics"中提供了几个与异常处理相关的中间件,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户 ...

随机推荐

  1. day07 MySQL索引事务

    day07 MySQL索引事务 昨日内容回顾 pymysql模块 # 链接数据库都是使用这个模块的 # 创建链接 import pymysql conn = pymysql.connect( host ...

  2. day30线程(Threads)

    day30线程(Threads) 1.开启线程 一.什么是线程: 1.进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程. 2.主进程中的线程称为主线程,其他开启的线程称 ...

  3. Scala【需求二:求各省市的各个指标】

    需求处理步骤 原始数据->json->过滤->列裁剪 需求二:求各省市的各个指标 原始数据 文本pmt.json,每一行都是一个json字符串.里面包含ip等信息 {"se ...

  4. 【Other】逻辑分析仪的使用(UART、SPI)

    首先上一张接线示意图 上方是UART的接线方式,下方则是SPI的 事实上,这样接就能收到信号了 如果是SPI,要设定自己为主机,UART则没有这个问题 下面来说明逻辑分析仪的界面设定 设定介绍完了 下 ...

  5. Enumeration遍历http请求参数的一个例子

    Enumeration<String> paraNames=request.getParameterNames(); for(Enumeration e=paraNames;e.hasMo ...

  6. 【编程思想】【设计模式】【行为模式Behavioral】command

    Python版 https://github.com/faif/python-patterns/blob/master/behavioral/command.py #!/usr/bin/env pyt ...

  7. vueAPI (data,props,methods,watch,computed,template,render)

    data Vue 实例的数据对象.Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响应数据变化.实例创建之后,可以通过vm.$data来访问原始数据 ...

  8. IT过来人的10点经验谈

    1 入行要趁早,正常是22岁本科或25岁硕士毕业入行.如果是零基础经培训班加持的,尽量在28岁前入行,30岁以后再想要入行IT的,千万慎重. 2 IT行业确实能挣大钱,而且能为学历一般学校一般家庭背景 ...

  9. SQLserver 2014 如何使用Datename()函数获取对应时间

    一.在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate() 二.用DateName()就可以获得相应的年.月.日,然后再把它们连接起来就可 ...

  10. [BUUCTF]PWN11——get_started_3dsctf_2016

    [BUUCTF]PWN11--get_started_3dsctf_2016 题目网址:https://buuoj.cn/challenges#get_started_3dsctf_2016 步骤: ...