matplotlib中marker支持的数据类型
marker有4种类型,分别是:
- Unfilled markers: 无填充形状
- Filled markers: 填充形状
- markers created from Tex symbols: 即用tex字符串定义的形状
- created from paths:自定义的matplotlib中的Path对象即路径。
4种类型中前两种即无填充类型和填充类型都是matplotlib本身就有的,没有可扩充性。第三种tex字符串也只能表现一些特殊的形状,可扩充性也不是很强。最后一种Path对象可以自己定义形状,可扩充性比较强。
无填充形状和填充形状
使用这种形状只需给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.sca<div style="color:transparent">本文来源gaodai^.ma#com搞#代!码网</div>tter(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 plt import matplotlib.path as mpath import numpy as np star = mpath.Path.unit_regular_star(6) # 星型Path circle = 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 plt import matplotlib.path as mpath import numpy as np circle = 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()