matplotlib——2. 形状和路径(Shape and Collection)底纹(hatch)

news2024/11/19 8:33:25

文章目录

  • 1. 形状和路径
    • 1.1 PatchCollection替换热力图数字
      • 1.1.1原始的数字代码
      • 1.1.2 替换为PatchCollection的代码
    • 1.2 PatchCollection绘制目标检测(COCO)标签
    • 1.3 PatchCollection绘制分割(COCO)标签
  • 2. 底纹(hatch)
    • 2.1 简单示例(add_patch)
    • 2.2 add_artist和add_collection(PatchCollection)中hatch设置
    • 2.3 底纹样式列表

1. 形状和路径

先去看这个CSDN博客:matplotlib高级教程之形状与路径——patches和path

  • 这个讲了一下patches和path大概是什么东西,就不搬过来了,
  • 要是嫌排版丑,可以看这个简书上转载的这篇:matplotlib 之形状与路径:patches和path

参考:

  • matplotlib-Reference for Matplotlib artists,左侧Shapes and collections这一个栏目都可以点点看
  • 简书:matplotlib 之形状与路径:patches和path
    • 实际上转自CSDN博客:matplotlib高级教程之形状与路径——patches和path
  • Matplotlib添加自定义形状

1.1 PatchCollection替换热力图数字

1.1.1原始的数字代码

import numpy as np
import matplotlib
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import colormaps as cm
from matplotlib.collections import PatchCollection
import matplotlib.patches as mpatches
# %matplotlib inline
%matplotlib ipympl

vegetables = ["cucumber", "tomato", "lettuce", "asparagus",
              "potato", "wheat", "barley"]
farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening",
           "Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]


harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],
                    [2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],
                    [1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],
                    [0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],
                    [0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],
                    [1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],
                    [0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])


fig, ax = plt.subplots()

cb = plt.colorbar(matplotlib.cm.ScalarMappable(cmap = "RdBu_r"),location= "right")
cb.set_label('Y',loc='top')

# 1. 数字显示
# 默认以图像方式显示其实就和热力图效果差不多。。
im = ax.imshow(harvest,cmap='RdBu_r')
# imshow和matshow,对于热力图显示来说,是差不多的,x轴一个在上,一个在下
# https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.matshow.html#matplotlib.pyplot.matshow
# im = ax.matshow(harvest,cmap='RdBu_r')

# 为每个格子设置数字label
for i in range(len(farmers)):
    for j in range(len(vegetables)):
        text = ax.text(j, i, harvest[i, j],
                       ha="center", va="center", color="w",fontsize=10)
 # 设置x轴和y轴刻度是上面的类别
ax.set_xticks(np.arange(len(farmers)), labels=farmers,fontsize=10)
ax.set_yticks(np.arange(len(vegetables)), labels=vegetables,fontsize=10)
# ax.set_yticks(np.arange(len(vegetables)), np.arange(len(vegetables)),fontsize=10)

# 旋转x轴刻度,保证显示和对齐
plt.setp(ax.get_xticklabels(), rotation=15, ha="right",
         rotation_mode="anchor")
plt.autoscale(enable=True, axis='both', tight=True)
ax.set_xlabel('X')
ax.set_ylabel('y')
# 这个label设置参考:
# <https://matplotlib.org/stable/gallery/shapes_and_collections/ellipse_collection.html#sphx-glr-gallery-shapes-and-collections-ellipse-collection-py>

plt.show()
# plt.close("all")

在这里插入图片描述

参考: https://matplotlib.org/stable/gallery/images_contours_and_fields/image_annotated_heatmap.html

1.1.2 替换为PatchCollection的代码

import numpy as np
import matplotlib
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import colormaps as cm
from matplotlib.collections import PatchCollection
import matplotlib.patches as mpatches
# %matplotlib inline
%matplotlib ipympl

vegetables = ["cucumber", "tomato", "lettuce", "asparagus","potato", "wheat", "barley"]
farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening",
           "Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]


harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],
                    [2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],
                    [1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],
                    [0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],
                    [0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],
                    [1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],
                    [0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])

fig2, ax2 = plt.subplots()

allCircles=[]
R = harvest/harvest.max()/2
xLen = len(farmers)
yLen= len(vegetables)
for i in range(xLen):
    for j in range(yLen):
        allCircles.append(mpatches.Circle((j,i),R[j][i]))
                          
col = PatchCollection(allCircles, array =R.flat, cmap="RdBu_r")

ax2.add_collection(col)
colorbar = plt.colorbar(col)
colorbar.set_label('y', rotation=360,loc="top")

# 这里默认设置主要刻度
ax2.set_xticks(np.arange(len(farmers)), labels=farmers,fontsize=10)
ax2.set_yticks(np.arange(len(vegetables)), labels=vegetables,fontsize=10)
# ax.set_yticks(np.arange(len(vegetables)), np.arange(len(vegetables)),fontsize=10)

# 关键是这里的这个minor参数,负责设置主要刻度还是次要刻度。
# If ``False``, set the major ticks; if ``True``, the minor ticks.
# 这里设置次要刻度,有了次要刻度后,每个圆心都对应次要刻度
ax2.set_xticks(np.arange(7+1)-0.5,minor=True)
ax2.set_yticks(np.arange(7+1)-0.5,minor=True)
ax2.grid(which='minor')

# 旋转x轴刻度,保证显示和对齐
plt.setp(ax2.get_xticklabels(), rotation=15, ha="right",
         rotation_mode="anchor")
plt.autoscale(enable=True, axis='both', tight=True)
ax2.set_xlabel('X')
ax2.set_ylabel('Y')
plt.imshow()

在这里插入图片描述

参考:

  • CSDN博客:【matplotlib】使用PatchCollection绘制带圆圈的热力图
  • stackoverflow:setting color range in matplotlib patchcollection

1.2 PatchCollection绘制目标检测(COCO)标签

这是基于coco标记格式进行的,代码如下:

from pycocotools.coco import COCO
import numpy as np
from PIL import Image,ImageOps
from matplotlib.collections import PatchCollection
from matplotlib.patches import Polygon

def show_box_only(coco,anns,show_label_bbox=True,is_filling=True):
    """
    coco:定义的coco对象
    anns:coco对象里得到的标注对象
    show_label_bbox:是否显示标签
    is_filling:是否对box进行填充
    """
    ax = plt.gca()
    ax.set_autoscale_on(False)
    polygons = []
    color = []
    
    image2color = dict()
    image2color[0]="orchid"
    image2color[1]="tab:blue"
    image2color[2]="pink"
    
    for ann in anns:
        # 随机生成一个0~1之间的数,作为box颜色
        c = (np.random.random((1, 3))*0.6+0.4).tolist()[0]
        # 获取bbox坐标
        [bbox_x, bbox_y, bbox_w, bbox_h] = ann['bbox']
        # Polygon需要接受四个点的坐标,顺时针或者逆时针都行
        poly = [[bbox_x, bbox_y], [bbox_x, bbox_y+bbox_h], [bbox_x+bbox_w, bbox_y+bbox_h], [bbox_x+bbox_w, bbox_y]]
        np_poly = np.array(poly).reshape((4,2))
        polygons.append(Polygon(np_poly))
        color.append(c)
        
        # 显示label文字
        if show_label_bbox:
            label_box = dict(facecolor =image2color[ann['category_id']], boxstyle="Round")
            # print(image2color[ann['category_id']])
            ax.text(bbox_x, bbox_y, f"{coco.loadCats(ann['category_id'])[0]['name']}", color="white",fontsize=10,bbox=label_box)
        else:
            pass
    if is_filling:
        # 显示前景色
        p = PatchCollection(polygons, facecolor=color, linewidths=0, alpha=0.4)
        ax.add_collection(p)
    # 只画框
    p = PatchCollection(polygons, facecolor='none', edgecolors=color, linewidths=2)
    ax.add_collection(p)


# 调用上面的函数
import os

dataDir= "datasets/cat_dataset/images"
annFile='datasets/cat_dataset/annotations/annotations_all.json'

coco = COCO(annotation_file=annFile)
image_ids=coco.getImgIds()
np.random.shuffle(image_ids)

plt.figure(figsize=(16,5))
for i in range(8):
    image_data=coco.loadImgs(image_ids[i])[0]
    img_path = os.path.join(dataDir,image_data.get("file_name"))

    annotation_ids = coco.getAnnIds(imgIds=image_data['id'])
    annotation = coco.loadAnns(annotation_ids)

    ax=plt.subplot(2,4,i+1)
    image = Image.open(img_path)
    imageWithEXIF=ImageOps.exif_transpose(image)
    ax.imshow(imageWithEXIF)
    
    show_box_only(coco,annotation)
    plt.title(image_data["file_name"])
    plt.xticks([])
    plt.yticks([])
plt.tight_layout()

在这里插入图片描述

1.3 PatchCollection绘制分割(COCO)标签

和上面差不多,效果如下:
在这里插入图片描述

2. 底纹(hatch)

其实matplotlib里的绘制和ppt里很像,都有形状,也有底纹颜色等的设置,比如:

2.1 简单示例(add_patch)

以下是来自:Hatch demo的示例

hatch底纹的颜色默认和edgecolor(ec)一致,不设置默认就是黑色

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

x = np.arange(1, 5)
y1 = np.arange(1, 5)
y2 = np.ones(y1.shape) * 4

fig = plt.figure()
axs = fig.subplot_mosaic([['bar1', 'patches'], ['bar2', 'patches']])

axs['bar1'].bar(x, y1, edgecolor='black', hatch="/")
axs['bar1'].bar(x, y2, bottom=y1, edgecolor='black', hatch='//')

axs['bar2'].bar(x, y1, edgecolor='black', hatch=['--', '+', 'x', '\\'])
axs['bar2'].bar(x, y2, bottom=y1, edgecolor='black',
                hatch=['*', 'o', 'O', '.'])

x = np.arange(0, 40, 0.2)
axs['patches'].fill_between(x, np.sin(x) * 4 + 30, y2=0,
                            hatch='///', zorder=2, fc='c')
"""
1. add_patch的hatch设置
"""
axs['patches'].add_patch(Ellipse((4, 50), 10, 10, fill=True,
                                 hatch='*', facecolor='y'))
axs['patches'].add_patch(Polygon([(10, 20), (30, 50), (50, 10)],
                                 hatch='\\/...', facecolor='g'))
axs['patches'].set_xlim([0, 40])
axs['patches'].set_ylim([10, 60])
axs['patches'].set_aspect(1)
plt.show()

2.2 add_artist和add_collection(PatchCollection)中hatch设置


from matplotlib.collections import PatchCollection
import matplotlib.patches as mpatches
import matplotlib as mlp
import numpy as np

"""
2. add_artist中patches的hatch设置
"""
circle = mpatches.Circle((0, 0), 0.1, ec="yellow",hatch="+")


path = np.array([[0,0],[0.1,0.2],[0.2,0.1]])
patchWithPolygon = PatchCollection([mlp.patches.Polygon(path)], ec="white")
"""
3. add_collection的hatch设置
"""
patchWithPolygon.set(hatch="*")

fig, axs = plt.subplots(1, 2, figsize=(4, 2), layout="constrained")
axs.flat[0].add_artist(circle)
# axs.flat[0].set_axis_off()
axs.flat[0].set(title=type(circle).__name__,
           aspect=1, xlim=(-.2, .2), ylim=(-.2, .2))

axs.flat[1].add_collection(patchWithPolygon)
axs.flat[1].set(title=type(patchWithPolygon).__name__,
           aspect=1, xlim=(-.3, .3), ylim=(-.3, .3))

x = [float(i[0]) for i in path]
y = [float(i[1]) for i in path]
axs.flat[1].scatter(x,y,c='r')

plt.show()

在这里插入图片描述

参考:

  • matplotlib.collections
  • matplotlib.patches.Circle

2.3 底纹样式列表

常见的底纹详见:https://matplotlib.org/stable/gallery/shapes_and_collections/hatch_style_reference.html

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建Zabbix服务(Linux系统)

环境&#xff1a; centos7、lamp、防火墙关闭、selinux关闭 配置阿里云zabbix yum源 [rootchenshuyi ~]# rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.centos.noarch.rpm 获取https://mirrors.aliyun.com/zabbix/zabbix/…

开启iis服务器通过php获取MySQL数据

开启iis服务器通过php获取MySQL数据 第一步开启iis服务器。 具体的可以查看这个&#xff1a;http://www.wokk.cn/40547.html 1.全部勾选,把万维网服务和web管理工具全部勾选。 2.添加网站&#xff0c;在网站这里添加网站&#xff0c;物理连接路径为你的网站存放的根目录。 3…

sql知识集锦

sql执行顺序 SELECT 的执行顺序 关键字的顺序是不能颠倒的&#xff1a; SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … 2.SELECT 语句的执行顺序&#xff08;在 MySQL 和 Oracle 中&#xff0c;SELECT 执行顺序基本相同&#xff09;&#xff1a; FROM >…

基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制, 坐标变换,电流环,速度环,位置环,电机反馈接口,SVPWM

一个基于FPGA的永磁同步伺服控制系统&#xff0c;利用Verilog语言在FPGA上实现了伺服电机的矢量控制、坐标变换、电流环、速度环、位置环以及电机反馈接口。这个系统具有很高的研究价值。 涉及到的知识点和领域范围主要包括&#xff1a;FPGA&#xff08;现场可编程门阵列&…

2024广西大学计算机考研828 重点知识点分享 经验分享

这是广西大学828的考试大纲和参考书目。其实细看考试内容&#xff0c;第一点“计算机程序设计基础知识”的内容是比较散的&#xff0c;很难从给定的参考书目中的固定的一章或一节找到相关知识点&#xff0c;有的能找到&#xff0c;就是分散的比较乱&#xff0c;有的甚至都没有&…

动态规划入门-数据结构与算法教程

动态规划&#xff08;DP&#xff09;是一种在多项式时间内解决某些特定类型问题的技术。动态规划解决方案比指数蛮力法更快&#xff0c;并且可以很容易地证明其正确性。 动态规划主要是对普通递归的优化。只要我们看到一个递归解决方案重复调用相同的输入&#xff0c;我们就可以…

软考电子商务设计师备考资料

中级科目还好&#xff0c;难度肯定是有点的&#xff0c;而且电子商务设计师科目是近几年新增的&#xff0c;网上资料也比较少 电子商务设计可以理解为网页设计和平面设计的结合,但同时增加了用户体验和人机交互的一-些概念,互联网变成了传播&#xff0c;最终目的是销售商品.所…

nginx配置开机启动(Windows环境)

文章目录 1、下载nginx&#xff0c;并解压2、配置nginx.conf&#xff0c;并启动Nginx3、开机自启动 1、下载nginx&#xff0c;并解压 2、配置nginx.conf&#xff0c;并启动Nginx 两种方法&#xff1a; 方法一&#xff1a;直接双击nginx.exe&#xff0c;双击后一个黑色弹窗一闪…

Redis布隆过滤器详解

目录 一、前言二、RedisBloom 安装与使用三、RedisBloom 常用命令汇总四、通过 Jedis 使用 RedisBloom五、Redisson 封装的布隆过滤器六、使用哪种方式的过滤器比较好&#xff1f; 一、前言 布隆过滤器&#xff08;Bloom Filter&#xff09;是 Redis 4.0 版本提供的新功能&…

rewrite 重写跳转

Nginx Rewrite–重写跳转 Nginx Rewrite--重写跳转 一、概述&#xff1a;1.Rewrite 跳转场景&#xff1a;2.Rewrite 跳转实现&#xff1a;3.Rewrite 实际场景&#xff1a;4.Nginx正则表达式&#xff1a;5.Rewrite 命令&#xff1a;6.location分类&#xff1a;7.比较rewrite和l…

【FFmpeg实战】音视频解封装格式

转载自原文地址&#xff1a;https://www.cnblogs.com/zuojie/p/16798273.html 一、什么是封装格式 封装格式也称为容器&#xff0c;用于打包音频、视频以及字幕等等&#xff0c;比如常见的容器有MP4、MOV、WMV、FLV、AVI、MKV等等。容器里面装的是音视频的压缩帧&#xff0c;但…

5、基于Python所写的飞机大战设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87953348?spm1001.2014.3001.5503 《彩图版飞机大战》程序使用说明 在PyCharm中运行《彩图版飞机大战》即可进入如图1所示的游戏界面。 图1 游戏主界面 具体的操作步骤如下&#xff…

ASEMI代理NXP可控硅BT139-600E参数,BT139-600E规格

编辑-Z BT139-600E参数描述&#xff1a; 型号&#xff1a;BT139-600E 断态重复峰值电压VDRM&#xff1a;600V RMS导通电流IT(RMS)&#xff1a;16A 非重复峰值导通电流ITSM&#xff1a;155A 峰值栅极电流IGM&#xff1a;2A 峰值栅极功率PGM&#xff1a;5W 储存温度Tstg&…

C++进阶—二叉搜索树Key、Key-Value模型应用及二叉树OJ(非递归实现遍历)

目录 1、二叉树搜索模型实现及应用场景 1. 二叉搜索树Key模型及其应用 2. 二叉搜索树Key-Value模型及其应用 2、二叉树OJ 2.1 根据二叉树创建字符串 2.2 二叉树的层序遍历I 2.3 二叉树的层序遍历II 2.4 二叉树的最近公共祖先 2.5 二叉搜索树及双向链表 2.6 从前序与中…

想学芯片专业?一文讲清楚芯片报考指南

2021年清北相继成立集成电路学院之后&#xff0c;国内在电子方面有实力积累的高校纷纷跟进&#xff0c;设立集成电路学院、开设集成电路相关专业。 直到今年&#xff0c;高校在集成电路方面的投入和培养力度&#xff0c;仍在持续并越来越大。 就在今年&#xff0c;示范性28所…

CDN是什么?

81. CDN是什么&#xff1f; CDN&#xff08;Content Delivery Network&#xff09; 即内容分发网络&#xff0c;是一种分布式的网络架构&#xff0c;旨在提高用户获取内容的速度、可用性和安全性。CDN通过将内容部署到全球各个节点服务器&#xff0c;并根据用户的地理位置将内…

有关软件检测实验室检测报告的全部知识点盘点

检测报告是实验室检测成果的重要载体&#xff0c;也是软件检测实验室质量管理水平的一个重要体现&#xff0c;本文我们就一起来看一下&#xff0c;软件检测实验室在申请cnas测试认证时&#xff0c;应该如何规范实验室的检测报告。 首先我们一起来看一下&#xff0c;cnas官方对…

记编译 Doris 的过程

目录 概述 1、关于clang 2、链接静态库的问题 3、 cmake的知识 4、关于nm 5、关于 ABI 6、关于debug info 概述 尝试编译 doris&#xff0c;其过程异常坎坷&#xff0c;不过也学到了很多东西。 首先&#xff0c;按照doris官网上的编译指导&#xff0c;下载ldb_toolchai…

python图像处理实战(三)—图像几何变换

&#x1f680;写在前面&#x1f680; &#x1f58a;个人主页&#xff1a;https://blog.csdn.net/m0_52051577?typeblog &#x1f381;欢迎各位大佬支持点赞收藏&#xff0c;三连必回&#xff01;&#xff01; &#x1f508;本人新开系列专栏—python图像处理 ❀愿每一个骤雨初…

Vue实例知识点分享

文章目录 导文下面是创建 Vue 实例的基本步骤 常用的 Vue 实例方法和属性总结 导文 Vue的实例是用来创建 Vue 应用程序的对象。通过实例化 Vue 构造函数&#xff0c;我们可以创建一个具有响应式数据、计算属性、方法和生命周期钩子等特性的 Vue 实例。 下面是创建 Vue 实例的基…