matplotlib如何实现自定义散点形状marker
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇文章给大家分享的是有关matplotlib如何实现自定义散点形状marker的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。无填充形状和填充形状使用这种形状只需给mark
千家信息网最后更新 2025年01月24日matplotlib如何实现自定义散点形状marker
这篇文章给大家分享的是有关matplotlib如何实现自定义散点形状marker的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
无填充形状和填充形状
使用这种形状只需给marker指定一个字符或者一个数字即可
Tex形状
通过自定义一个符合Latex格式的字符串复制给marker即可,因此如果想让makrer为一个数字或者单词字母或者特殊的符号便可以定义这样一个字符串
import matplotlib.pyplot as plt import numpy as np data = np.random.rand(3,2)fig = plt.figure() ax = fig.add_subplot(111) markers = ["$\u266B$", r"$\frac{1}{2}$", "$\heartsuit$"]for i in range(data.shape[0]): ax.scatter(data[i,0], data[i,1], marker=markers[i], s=400) plt.show()
Path对象
matplotlib中Path类的定义参考了图片格式svg格式的定义,具体不做阐述,可自行百度。Path对象给定制marker提供了极大的便利,可以使用Path模块中已经定义好的一些Path类供用户组合,用户也可以自定义Path类
使用Path模块中的Path对象
import matplotlib.pyplot as pltimport matplotlib.path as mpathimport numpy as npstar = mpath.Path.unit_regular_star(6) # 星型Pathcircle = mpath.Path.unit_circle() # 圆形Path # 整合两个路径对象的点verts = np.concatenate([circle.vertices, star.vertices[::-1, ...]])# 整合两个路径对象点的类型codes = np.concatenate([circle.codes, star.codes])# 根据路径点和点的类型重新生成一个新的Path对象 cut_star = mpath.Path(verts, codes)plt.plot(np.arange(10)**2, '--r', marker=cut_star, markersize=15)plt.show()
自定义Path对象
import matplotlib.pyplot as pltimport matplotlib.path as mpathimport numpy as npcircle = mpath.Path.unit_circle() # 获得一个圆 verts_part= circle.wedge(340,220).vertices # 按逆时针从340度到220度部分圆的路径点codes_part = circle.wedge(340,220).codes # 点类型 verts_part = verts_part[1:-2] # 去除第一个点和最后两个点 codes_part = codes_part[1:-2] # 整合新的点 verts = np.concatenate([np.array([[0,-2]]), verts_part, np.array([[0,-2]])]) codes = [mpath.Path.MOVETO] + codes_part.tolist() + [mpath.Path.CLOSEPOLY] icon = mpath.Path(vertices=verts, codes=codes)plt.plot(verts[:,0], verts[:,1]) plt.show()
plt.scatter(data[:,0], data[:,1], marker=icon, s=300, facecolor="none",edgecolors="black")plt.show()
从svg格式转化为Path对象
既然Path类的定义起源于svg,那么引申出一个问题,能否将svg格式的图片转化为Path对象?这样我们就不用费力自己定义Path对象,而是可以用别人已经定义好的svg格式的图片转换为Path对象
答案是可以的,可以用svgpath3mpl库解析svg转化为matplotlib的Path对象
import matplotlib as mpl from svgpath3mpl import parse_pathimport xml.etree.ElementTree as etree from six import StringIO import re
# svg格式图片的svg代码svg = """"""# 解析代码 tree = etree.parse(StringIO(svg)) root = tree.getroot() width = int(re.match(r'\d+', root.attrib['width']).group())height = int(re.match(r'\d+', root.attrib['height']).group())path_elems = root.findall('.//{http://www.w3.org/2000/svg}path') # 解析出每个Path对象paths = [parse_path(elem.attrib['d']) for elem in path_elems] facecolors = [elem.attrib.get('fill', 'none') for elem in path_elems] facecolors = [c if c !="" else "none" for c in facecolors]edgecolors = [elem.attrib.get('stroke', 'none') for elem in path_elems]linewidths = [elem.attrib.get('stroke_width', 1) for elem in path_elems]
#定义旋转矩阵def rot(verts, az): #顺时针旋转 rad = az / 180 * np.pi verts = np.array(verts) rotMat = np.array([[np.cos(rad), -np.sin(rad)], [np.sin(rad), np.cos(rad)]]) transVerts = verts.dot(rotMat) return transVerts
# 合并每个Path对象verts = paths[0].vertices codes = paths[0].codes for i in range(1,len(paths)): verts = np.concatenate([verts, paths[i].vertices]) codes = np.concatenate([codes, paths[i].codes])verts = rot(verts, 180) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(verts[:,0], verts[:,1] , color="red") plt.show()
# 定义解析函数 def svg2path(svg): # 解析代码 tree = etree.parse(StringIO(svg)) root = tree.getroot() path_elems = root.findall('.//{http://www.w3.org/2000/svg}path') # 解析出每个Path对象 paths = [parse_path(elem.attrib['d']) for elem in path_elems] # 合并path对象 verts = paths[0].vertices codes = paths[0].codes for i in range(1, len(paths)): verts = np.concatenate([verts, paths[i].vertices]) codes = np.concatenate([codes, paths[i].codes]) # 复原为原来的形状 verts = rot(verts, 270) verts = np.fliplr(verts) # 水平翻转,镜像 #verts = (verts - verts.min(0)) / (verts.max(0) - verts.min(0)) icon = mpath.Path(vertices=verts, codes=codes) return icon
svg = ["""""", """""", """"""]icons = []for s in svg: icons.append(svg2path(s))
fig = plt.figure() ax = fig.add_subplot(111) for i in range(data.shape[0]): ax.scatter(data[i,0], data[i,1], marker=icons[i], s=3000)plt.show()
感谢各位的阅读!关于"matplotlib如何实现自定义散点形状marker"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
对象
形状
格式
图片
路径
两个
代码
字符
类型
整合
内容
字符串
数字
更多
模块
用户
篇文章
参考
不错
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络技术技能考试教学
淘宝九灵捏脸数据库
地下城堡3如何更换服务器
数据库安全管理子系统实现
amd神经网络技术
软件开发数学模型
online2无法连接服务器
中学生网络安全文章
网络安全班会主持人主持稿
中科电网络安全研究院 户口
维护网络安全感悟
不能从仓库里读取组数据库
软件开发隔离环境
南京天象网络技术
java服务器开发是前端吗
中国邮政集团软件开发中心笔试
2021中小学生网络安全知识
河北雄安祥龙瑞麟互联网科技
14g服务器
网宿科技_互联网_大数据
军人网络安全警示案例
沄游网络技术有限公司
2021世界服务器跑分榜
网络技术在教育中的作用
v5服务器尺寸
河北雄安祥龙瑞麟互联网科技
辽宁葫芦岛软件开发
别人访问自己数据库
数据库界面设计教程
代理服务器帐号