为直线上的单个点设置标记
我用Matplotlib这个工具在图上画了线。现在我想给线上的每个点设置不同的样式,特别是标记的样式。我该怎么做呢?
为了更清楚我的问题,我想要的是能够为线上的每个标记单独设置样式,而不是给整条线上的所有标记都设置一样的样式。
5 个回答
16
为了将来参考,plot()
返回的 Line2D
对象还有一个 set_markevery()
方法,这个方法可以让你只在特定的点上设置标记。详细信息可以查看这个链接:https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D.set_markevery
87
这里有一张图片,展示了所有标记的名称和描述,希望这能对你有所帮助。
import matplotlib.pylab as plt
markers = ['.',',','o','v','^','<','>','1','2','3','4','8','s','p','P','*','h','H','+','x','X','D','d','|','_']
descriptions = ['point', 'pixel', 'circle', 'triangle_down', 'triangle_up','triangle_left',
'triangle_right', 'tri_down', 'tri_up', 'tri_left', 'tri_right', 'octagon',
'square', 'pentagon', 'plus (filled)','star', 'hexagon1', 'hexagon2', 'plus',
'x', 'x (filled)','diamond', 'thin_diamond', 'vline', 'hline']
x=[]
y=[]
for i in range(5):
for j in range(5):
x.append(i)
y.append(j)
plt.figure(figsize=(8, 8))
for i,j,m,l in zip(x,y,markers,descriptions):
plt.scatter(i,j,marker=m)
plt.text(i-0.15,j+0.15,s=m+' : '+l)
plt.axis([-0.1,4.8,-0.1,4.5])
plt.axis('off')
plt.tight_layout()
plt.show()
535
在调用 plot
函数时,可以指定关键字参数 linestyle
和/或 marker
来设置线条样式和标记样式。
比如,你可以使用虚线和蓝色圆圈作为标记:
plt.plot(range(10), linestyle='--', marker='o', color='b', label='line with marker')
plt.legend()
还有一个更简便的写法,可以实现同样的效果:
plt.plot(range(10), '--bo', label='line with marker')
plt.legend()
这里有一份可能的线条和标记样式的列表:
================ ===============================
character description
================ ===============================
- solid line style
-- dashed line style
-. dash-dot line style
: dotted line style
. point marker
, pixel marker
o circle marker
v triangle_down marker
^ triangle_up marker
< triangle_left marker
> triangle_right marker
1 tri_down marker
2 tri_up marker
3 tri_left marker
4 tri_right marker
s square marker
p pentagon marker
* star marker
h hexagon1 marker
H hexagon2 marker
+ plus marker
x x marker
D diamond marker
d thin_diamond marker
| vline marker
_ hline marker
================ ===============================
补充: 这里有一个例子,展示如何标记一部分特定的点,这是根据评论中的要求提供的:
import numpy as np
import matplotlib.pyplot as plt
xs = np.linspace(-np.pi, np.pi, 30)
ys = np.sin(xs)
markers_on = [12, 17, 18, 19]
plt.plot(xs, ys, '-gD', markevery=markers_on, label='line with select markers')
plt.legend()
plt.show()
最后这个例子使用了 markevery
这个关键字参数,从版本 1.4 开始就可以用了,这是因为合并了 这个功能分支。如果你使用的是较旧版本的 matplotlib,仍然可以通过在折线图上叠加散点图来实现相同的效果。更多细节可以查看 编辑历史。