两种利用matplotlib绘制无填充的多边形的方法:ax.fill()和Polygon

两种利用matplotlib绘制无填充的多边形的方法:ax.fill()和Polygon

下面我们将使用np.rand随机生成5个多边形的顶点,使用不同的方法绘制多边形。

ax.fill()绘制多边形

函数原型为:

Axes.fill(*args, data=None, **kwargs)
args参数指的是按x, y, [color]给出的x坐标列表、y坐标列表和多边形的颜色。
data参数是带标记的多边形参数,一般用不上
kwargs是Polygon类型的属性,一般也用不上

ax.fill函数的调用方式为:

# x,y是元素数量相同的list
ax.fill(x, y)                    # a polygon with default color
ax.fill(x, y, "b")               # a blue polygon
# x2,y2也是元素数量相同的list
ax.fill(x, y, x2, y2)            # two polygons
ax.fill(x, y, "b", x2, y2, "r")  # a blue and a red polygon

代码示例如下:

import numpy as np
import matplotlib.pyplot as plt

N=5# N个顶点
points1 = np.random.rand(N, 2)# 第一个多边形的顶点集
points2 = np.random.rand(N, 2)# 第二个多边形的顶点集
points3 = np.random.rand(N, 2)# 第三个多边形的顶点集
points4 = np.random.rand(N, 2)# 第四个多边形的顶点集
fig, ax1 = plt.subplots(1,1)
# 绘制
ax1.fill(points1[:,0],points1[:,1], facecolor='none', edgecolor='orangered', linewidth=2)
ax1.fill(points2[:,0],points2[:,1], facecolor='none', edgecolor='blue', linewidth=1)
ax1.fill(points3[:,0],points3[:,1], facecolor='none', edgecolor='black', linewidth=1)
ax1.fill(points4[:,0],points4[:,1], facecolor='none', edgecolor='green', linewidth=1)
# 显示
plt.show()

还可以参考官方示例绘制科赫雪花。

matplotlib.patches.Polygon + add_patch绘制

Polygon类型是patches的一个子类,专门负责存储多边形信息,包括顶点坐标和绘制属性(边色彩、填充色彩、线型等等)。其使用方式为,先构造Polygon类型对象,再通过add_patch加入绘图轴中。

Polygon类型的构造函数(详细参考):

Polygon(xy, *, closed=True, **kwargs)
    xy : 尺寸为(N,2)数组,存储了多边形的N个顶点。
    closed : bool类型,默认为True。标记是否多边形是封闭的(第一个点和最后一点坐标是否相同)
    **kwargs: 多边形的填充颜色、边颜色、边线型等属性

示例代码如下:

import numpy as np
from matplotlib.patches import Polygon
import matplotlib.pyplot as plt

my_quad = Polygon([(0,1), (1,2), (1,0), (2,1)])
my_tri  = Polygon([(3,1), (1,3), (4,2), (2,4)])

fig, ax = plt.subplots(1,1)

a = ax.add_patch( my_tri )
a.set_fill(False)
b = ax.add_patch( my_quad )

minx, maxx = ax.get_xlim()# 获取x轴上下限
ax.set_xlim(minx-5, maxx+5)# 设置x轴上下限
miny, maxy = ax.get_ylim()# 获取y轴上下限
ax.set_ylim(miny-5, maxy+5)

在上面的代码中,如果想让多边形仅绘制边界,不填充,有三种做法:

  1. 在Polygon构造函数中添加参数fill=False
  2. 使用add_patch()的返回值在绘制之前调用a.set_fill(False)
  3. 在绘制之前调用my_quad.set_fill(False)

第二种、第三种方法是等价的,因为add_patch的返回值就是传入的多边形对象。

matplotlib.patches.Polygon + PatchCollection + add_collection绘制

有时,需要绘制多边形的数量众多,挨个调用add_patch速度太慢,绘制太卡,这时就更推荐使用PatchCollection将所有多边形集中到一个collection中,然后再调用add_collection,最终绘制整个collection。

PatchCollection接受的参数如下:

    patches : list类型,每个元素都是`Patch`子类的对象,例如多边形、圆、矩形等。这个list中的各元素类型可以不同
    
    match_original : bool类型,默认为False。设置为True时,则使用每个Patch对象设置的原始绘制属性,而不是使用PatchColleciton的 **kwargs参数指定绘制属性(facecolor,
        edgecolor, linewidths, norm or cmap)

    **kwargs 一般设置*edgecolors*, *facecolors*, *linewidths*, *antialiaseds*等参数;若它们中任意一个为None,则使用`.rcParams`中的设置

示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.collections import PatchCollection
from matplotlib.patches import Circle, Polygon, Wedge

# Fixing random state for reproducibility
np.random.seed(19680801)


fig, ax = plt.subplots()

resolution = 50  # the number of vertices
N = 3
x = np.random.rand(N)
y = np.random.rand(N)
radii = 0.1*np.random.rand(N)
patches = []
for x1, y1, r in zip(x, y, radii):
    circle = Circle((x1, y1), r)
    patches.append(circle)

x = np.random.rand(N)
y = np.random.rand(N)
radii = 0.1*np.random.rand(N)
theta1 = 360.0*np.random.rand(N)
theta2 = 360.0*np.random.rand(N)
for x1, y1, r, t1, t2 in zip(x, y, radii, theta1, theta2):
    wedge = Wedge((x1, y1), r, t1, t2)
    patches.append(wedge)

# Some limiting conditions on Wedge
patches += [
    Wedge((.3, .7), .1, 0, 360),             # Full circle
    Wedge((.7, .8), .2, 0, 360, width=0.05),  # Full ring
    Wedge((.8, .3), .2, 0, 45),              # Full sector
    Wedge((.8, .3), .2, 45, 90, width=0.10),  # Ring sector
]

for i in range(N):
    polygon = Polygon(np.random.rand(N, 2), closed=True)
    patches.append(polygon)

colors = 100 * np.random.rand(len(patches))
p = PatchCollection(patches, alpha=0.4)# 不透明度0.4
#p.set_array(colors)# 随机设定颜色
ax.add_collection(p)
fig.colorbar(p, ax=ax)

plt.show()

在上面的代码中,如果想让多边形仅绘制黑色边界,不填充,则需要在PatchCollection构造时加入参数facecolors='none', edgecolors='black',即:

p = PatchCollection(patches, facecolors='none', edgecolors='black')

注意,这种方式设置的绘制属性整个collection是一样的,也就是说,patches包含的所有多边形都是一样的颜色、一样的线宽。要使每个多边形具有不同的颜色,可以将edgecolors参数设置为与patches相同长度的list。假如patches包含了三个多边形,则可以如下设置绘制颜色(边的颜色):

p = PatchCollection(patches, facecolors='none', edgecolors=['black','red','blue'])

将绘制黑色、红色、蓝色边缘的三个多边形。

也可以调用p.set_array()。不再赘述,可参考
参考PatchCollection

三种绘制方式效果对比

最后,在同一画布上绘制三个子图,查看效果:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection

if __name__=="__main__":
    N=5
    points1 = np.random.rand(N, 2)
    points2 = np.random.rand(N, 2)
    points3 = np.random.rand(N, 2)
    points4 = np.random.rand(N, 2)
    fig, (ax1, ax2, ax3) = plt.subplots(1,3)

    ax1.fill(points1[:,0],points1[:,1], facecolor='none', edgecolor='orangered', linewidth=2)
    ax1.fill(points2[:,0],points2[:,1], facecolor='none', edgecolor='blue', linewidth=1)
    ax1.fill(points3[:,0],points3[:,1], facecolor='none', edgecolor='black', linewidth=1)
    ax1.fill(points4[:,0],points4[:,1], facecolor='none', edgecolor='green', linewidth=1)
    
    plg1 = Polygon(points1, facecolor='none', ec='orangered', linewidth=2)
    plg2 = Polygon(points2, facecolor='none', ec='blue', linewidth=1)
    plg3 = Polygon(points3, facecolor='none', ec='black', linewidth=1)
    plg4 = Polygon(points4, facecolor='none', ec='green', linewidth=1)
    ax2.add_patch(plg1)
    ax2.add_patch(plg2)
    ax2.add_patch(plg3)
    ax2.add_patch(plg4)
    

    plg1 = Polygon(points1)
    plg2 = Polygon(points2)
    plg3 = Polygon(points3)
    plg4 = Polygon(points4)
    plg_lst1=[plg1,plg2]# 第一个collection里加两个Polygon对象
    plg_lst2=[plg3,plg4]# 第一个collection里也加两个Polygon对象
    collection1 = PatchCollection(plg_lst1, facecolors='none',ec=['orange','green'], linewidths=1, alpha=0.9)
    collection2 = PatchCollection(plg_lst2, facecolors='none',ec=['red','blue'], linewidths=2, alpha=0.9)
    ax3.add_collection(collection1)
    ax3.add_collection(collection2)

    ax1.set_aspect(1)
    ax2.set_aspect(1)
    ax3.set_aspect(1)
    plt.show()

结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/492040.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

hadoop安装及基本使用

环境准备 三台centos7虚拟机,设置固定ip(自己设置),设置ssh秘密登录(自己设置),安装jdk8(自己安装) 准备安装包hadoop-3.3.6.tar.gz 位置在/home/hadoop 准备服务器之间…

【线段树二分】第十三届蓝桥杯省赛C++ A组/研究生组 Python 研究生组《扫描游戏》(C++)

【题目描述】 有一根围绕原点 O 顺时针旋转的棒 OA,初始时指向正上方(Y 轴正向)。 在平面中有若干物件,第 i 个物件的坐标为(,),价值为 。 当棒扫到某个物件时,棒的长度会瞬间增长 &#xff…

服务运营 | 印第安纳大学翟成成:改变生活的水井选址

编者按: 作者于2023年4月在“Production and Operations Management”上发表的“Improving drinking water access and equity in rural Sub-Saharan Africa”探讨了欠发达地区水资源供应中的可达性和公平性问题。作者于2020年1月去往非洲埃塞俄比亚提格雷地区进行…

鸿蒙操作系统-初识

HarmonyOS-初识 简述安装配置hello world1.创建项目2.目录解释3.构建页面4.真机运行 应用程序包共享包HARHSP 快速修复包 官方文档请参考:HarmonyOS 简述 1.定义:HarmonyOS是分布式操作系统,它旨在为不同类型的智能设备提供统一的操作系统&a…

【前端学习——js篇】4.浅拷贝与深拷贝

具体可见https://github.com/febobo/web-interview 4.浅拷贝与深拷贝 ①栈内存与堆内存 栈内存(Stack Memory) 栈内存用于存储基本类型的变量和引用类型的变量引用(即指向堆内存中实际数据的指针)。当一个函数被调用时&#xf…

javaWeb医院在线挂号系统

功能描述 医院挂号系统主要用于实现医院的挂号,前台基本功能包括:用户注册、用户登录、医院查询、挂号、取消挂号、修改个人信息、退出等。 后台基本功能包括:系统管理员登录、医院管理、科室管理、公告管理、退出系统等。 本系统结构如下&…

申请IP地址证书

目录 IP证书的验证条件: 为什么需要申请IP地址证书? 申请IP证书的方法: 注释:IP地址证书也是SSL证书的一种,在验证IP地址所有权后部署于服务器上可实现https访问的一种证书。用公网IP证书可以解决很多问题&#xff…

JavaWeb学习笔记01

一、教程简介 全新JAVAWEB(里程碑版) 一套更适合后端工程师学习的WEB教程 All in Java 1、后端 ① Spring全家桶及微服务框架 ② 高性能数据库和消息组件 ③ Web攻击防护安全控制手段 ④ 其他第三方SDK生态环境 ...... 2、前端 ① 视图三大件&…

构建医疗服务新平台:开发智慧医院系统源码实战教学

本篇文章,小编将深入探讨如何通过开发智慧医院系统源码,构建医疗服务新平台的实战教学。 一、开发准备 在开始开发智慧医院系统之前,我们首先需要明确系统的功能需求和技术实现方案。 二、实战教学 1.系统架构设计 这包括数据库设计、前后…

【Git】日志功能

1. git日志显示 # 显示前3条日志 git log -3# 单行显示 git log --oneline# 图表日志 git log --graph# 显示更改摘要 git log --stat# 显示更改位置 git log --patch 或 git log -p# 查看指定文件的提交历史记录 git log {filename}例子1:单行显示 例子2&#xff…

洛谷_P4995 跳跳!_python写法

P4995 跳跳&#xff01; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) n int(input()) data list(map(int,input().split())) data.append(0) data.sort()sum 0 l 0 r len(data)-1 flag 1 while l<r:sum (data[l]-data[r])**2if flag:l 1flag 0else:r - 1flag 1…

Wind X98 DM R2蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 一些常见问题解答&#xff08;FAQ&#xff09;注意首次使用步骤蓝牙配对&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功能层1配置的功能默认的快捷键 蓝牙参数蓝牙MAC地址管理…

发现了一本超厉害的英语秘籍,绝对YYDS

昨天冷月小姐姐分享了一本书&#xff0c;她说是一位英语大神发她的。 我也打开了&#xff0c;很酷炫。 群友们也在与时俱进&#xff0c;随手截图&#xff0c;分享了大模型对文档的理解。 你可能会想&#xff0c;关注宏观经济有啥用&#xff0c;自己只是大海中的浪花一朵。 还有…

相交链表:寻找链表的公共节点

目录 一、公共节点 二、题目 三、思路 四、代码 五、代码解析 1.计算长度 2.等长处理 3.判断 六、注意点 1.leetcode的尿性 2.仔细观察样例 3.经验总结 一、公共节点 链表不会像两直线相交一样&#xff0c;相交之后再分开。 由于单链表只有一个next指针&#xff0…

github配置ssh

生成公钥 在电脑用户的目录下打开终端执行 ssh-keygen -t rsa: 执行完不要关 配置文件 看看用户的目录里 .ssh 目录&#xff1a; Host github.comHostname ssh.github.comPort 443配置公钥 复制 id_rsa.pub 文件里的内容 粘贴到 github上 连接密钥 回到刚才的终端…

Windows系统部署Net2FTP网站结合内网穿透轻松打造可公网访问个人云盘

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

【主成分分析(PCA)】

文章目录 一、什么是主成分分析&#xff08;PCA&#xff09;&#xff1f;主成分的选取方差的重要性数据降维 PCA的应用场景 二、主成分分析的工作原理1.方差和数据的重要性2.计算协方差矩阵3.特征值和特征向量4.选择主成分 三、PCA的实现步骤1.标准化数据集2.计算协方差矩阵3.计…

Windows应用商店打不开怎么办?

大家习惯在windows应用商店下载应用和软件,操作也很方便。最近,有用户却称,win10系统上网情况一切正常,但是就是无法打开应用商店,同时还伴随闪退。这该怎么办呢?针对此故障,小编整理好了解决方法,接下来,将和大家分享Windows应用商店打不开怎么办。 操作方法如下: 1…

SpringBoot如何优雅的进行参数校验

一、传统参数校验 虽然往事不堪回首&#xff0c;但还是得回忆一下我们传统参数校验的痛点。 下面是我们传统校验用户名和邮箱是否合法的代码 if (username null || username.isEmpty()) {throw new IllegalArgumentException("用户名不能为空"); }if (isValidEmai…

如何使用PHP和RabbitMQ实现延迟队列(方式一)?

前言 今天我们来做个小试验&#xff0c;用PHP和RabbitMQ实现消息队列的延迟功能。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和RabbitMQ实现消息队列&#xff1f;-CSDN博客 一、安装RabbitM…