在Matplotlib中为一行上的单个点设置标记

我使用Matplotlib在图形上绘制线条。现在我想要设置样式,特别是标记,为直线上的各个点。我怎么做呢?

为了澄清我的问题,我希望能够为一行上的单个标记设置样式,而不是该行上的每个标记。

507549 次浏览

在调用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()

enter image description here

下面是可能的线条和标记样式的列表:

================    ===============================
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()

enter image description here

由于这个特性分支的合并,使用markevery kwarg的最后一个例子在1.4+中是可能的。如果您使用旧版本的matplotlib,仍然可以通过在线形图上叠加散点图来获得结果。更多细节请参见编辑历史

作为将来的参考-由plot()返回的Line2D艺术家也有一个set_markevery()方法,它允许你只在某些点上设置标记-参见https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D.set_markevery

有一张图片显示了所有标记的名称和描述,希望对您有所帮助。

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()

enter image description here

一个简单的技巧来改变一个特定的点标记形状,大小…首先将其与所有其他数据一起绘制,然后仅与该点(如果想更改多个点的样式,则为该点集)绘制另一个图。 假设我们想要改变第二个点的标记形状:

x = [1,2,3,4,5]
y = [2,1,3,6,7]


plt.plot(x, y, "-o")
x0 = [2]
y0 = [1]
plt.plot(x0, y0, "s")


plt.show()
< p >的结果是: 多标记图 < / p >

enter image description here

这里有一个例子:

import numpy as np
import matplotlib.pyplot as plt


def grafica_seno_coseno():
x = np.arange(-4,2*np.pi, 0.3)
y = 2*np.sin(x)
y2 = 3*np.cos(x)
plt.plot(x, y,  '-gD')
plt.plot(x, y2, '-rD')
for xitem,yitem in np.nditer([x,y]):
etiqueta = "{:.1f}".format(xitem)
plt.annotate(etiqueta, (xitem,yitem), textcoords="offset points",xytext=(0,10),ha="center")
for xitem,y2item in np.nditer([x,y2]):
etiqueta2 = "{:.1f}".format(xitem)
plt.annotate(etiqueta2, (xitem,y2item), textcoords="offset points",xytext=(0,10),ha="center")
plt.grid(True)
plt.show()
    

    

grafica_seno_coseno()

enter image description here