千家信息网

matplotlib如何实现自定义散点形状marker

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章给大家分享的是有关matplotlib如何实现自定义散点形状marker的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。无填充形状和填充形状使用这种形状只需给mark
千家信息网最后更新 2026年11月02日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安全错误 数据库的锁怎样保障安全 科技信息互联网 互联网科技作文 以房互联网科技 万达互联网科技 互联网科技小额贷款 互联网科技公司名称 华中科技有哪些互联网大佬 剑昆互联网络科技有限公司临桂 随着互联网科技发展 速维有品互联网信息科技(苏州)有限公司 银川新华互联网科技学校联系电话 互联网行业科技股 保险科技服务互联网营销体系 群盈汇互联网科技有限公司 互联网时代的科技公司 江苏苏星互联网科技有限公司 广州千川互联网科技有限公司 工业互联网科技成果转化 恒生科技指数 中概互联网 华人运通互联网科技公司 金融科技创新监管互联网金融 易互联网科技有限公司 万易互联网科技 深圳齐家互联网科技 居家互联网科技有限公司 玉溪互联网科技怎么选 互联网科技与大数据专业 互联网企业科技类企业如何做账 云鲸互联网络科技有限公司 互联网企业和网络科技有限公司
    0