文章目录
- 简介
- 所有可用的绘图标记
- 绘图函数
- 标记绘制
简介
前面的博客简要介绍了matplotlib中的绘图标记,并列举出了部分可用标记点的类型,并画了个图作为示例,如下图下表所示。本文则将所有标记点的类型均绘制一遍
字符 | 类型 | 字符 | 类型 | 字符 | 类型 | 字符 | 类型 |
---|---|---|---|---|---|---|---|
‘-’ | 实线 | ‘–’ | 虚线 | ‘-.’ | 虚点线 | ‘:’ | 点线 |
‘.’ | 点 | ‘,’ | 虚线 | ||||
‘o’ | 圆点 | ‘*’ | 星型点 | ‘+’ | 加号点 | ‘x’ | 乘号点 |
‘v’ | 下三角点 | ‘^’ | 上三角点 | ‘<’ | 左三角点 | ‘>’ | 右三角点 |
‘1’ | 下三叉点 | ‘2’ | 上三叉点 | ‘3’ | 左三叉点 | ‘4’ | 右三叉点 |
‘s’ | 正方点 | ‘p’ | 五角点 | ‘h’ | 六边形1 | ‘H’ | 六边形2 |
‘D’ | 实心菱形点 | ‘d’ | 瘦菱形点 | ‘_’ | 横线点 |
所有可用的绘图标记
matplotlib.lines中提供了line2D类,其成员markers是一个字典,存放着绘图标记的映射信息。
from matplotlib.lines import Line2D
from pprint import pprint
pprint(Line2D.markers)
# 返回标记字典
{None: 'nothing',
0: 'tickleft',
1: 'tickright',
2: 'tickup',
3: 'tickdown',
4: 'caretleft',
5: 'caretright',
6: 'caretup',
7: 'caretdown',
8: 'caretleftbase',
9: 'caretrightbase',
10: 'caretupbase',
11: 'caretdownbase',
'': 'nothing',
' ': 'nothing',
'*': 'star',
'+': 'plus',
',': 'pixel',
'.': 'point',
'1': 'tri_down',
'2': 'tri_up',
'3': 'tri_left',
'4': 'tri_right',
'8': 'octagon',
'<': 'triangle_left',
'>': 'triangle_right',
'D': 'diamond',
'H': 'hexagon2',
'None': 'nothing',
'P': 'plus_filled',
'X': 'x_filled',
'^': 'triangle_up',
'_': 'hline',
'd': 'thin_diamond',
'h': 'hexagon1',
'o': 'circle',
'p': 'pentagon',
's': 'square',
'v': 'triangle_down',
'x': 'x',
'|': 'vline'}
从其返回值可以看出,字典的key既包含整数,也包含字符串,而None所对应的value为nothing,说明nothing代表没有标志。相应地,字符串"None"以及空字符串,空格字符串均对应nothing的value,说明这些key也对应无标记。
绘图函数
接下来构造一个函数,用以显示这些标记
import numpy as np
def plot_markers(markers, ncols=4, show=True):
text_style = dict(horizontalalignment='right',
verticalalignment='center', fontsize=12)
marker_style = dict(linestyle=':', color='0.8', markersize=10,
markerfacecolor="tab:blue", markeredgecolor="tab:gray")
y = -1
nrows = np.ceil(len(markers)/ncols) # 行数
fig, axs = plt.subplots(ncols=ncols)
for ax in axs:
ax.margins(0.2)
ax.set_ylim(-0.5, nrows-0.5)
ax.invert_yaxis()
ax.set_axis_off()
for i,m in enumerate(markers):
y = (y+1) % nrows
x = int(i // nrows)
axs[x].text(-0.5, y, repr(m), **text_style)
axs[x].plot([y] * 3, marker=m, **marker_style)
if show:
plt.show()
return fig
text_style用以约束文字风格,marker_style用以设置标记风格,markerfacecolor为填充颜色,markeredgecolor则为边缘颜色。但并非所有标记均有填充属性,其中有填充属性的,均被封装在了Line2D.filled_markers中。
repr函数用于打印key的真实值,例如’1’表示字符串,而1则表示整数。
标记绘制
下面就先来绘制一下具有填充属性的标志
plot_markers(Line2D.filled_markers)
效果如下
而不存在填充的标记,只需去掉Line2D.markers中与filled_markers重名的key即可
unfilled = [m for m, func in Line2D.markers.items()
if func != 'nothing' and m not in Line2D.filled_markers]
plot_markers(unfilled, ncols=6)
效果如图所示
可见,其中的确有部分marker只有边缘而无内容,但注入456等三角形也是存在填充物的,也就是说filled_markers并没有将所有filled标记挑选出来。