matplotlib:为一行上的各个点设置标记

dbm*_*kus 146 python numpy matplotlib

我用matplotlib在图上绘制线条.现在我想为线上的各个点设置样式,特别是标记.我该怎么做呢?

编辑:澄清我的问题,已经回答,我希望能够在一条线上设置单个标记的样式,而不是在所述行上的每个标记.

wim*_*wim 279

在您的通话中指定关键字args linestyle和/或.markerplot

例如,使用虚线和蓝色圆圈标记:

plt.plot(range(10), linestyle='--', marker='o', color='b')
Run Code Online (Sandbox Code Playgroud)

对同一件事的快捷方式调用:

plt.plot(range(10), '--bo')
Run Code Online (Sandbox Code Playgroud)

例1

以下是可能的行和标记样式的列表:

================    ===============================
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
================    ===============================
Run Code Online (Sandbox Code Playgroud)

编辑: 根据评论中的要求,标记任意点子集的示例:

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)
plt.show()
Run Code Online (Sandbox Code Playgroud)

例题

markevery由于此功能分支的合并,使用kwarg的最后一个示例在1.4+之后是可能的.如果您遇到旧版本的matplotlib,您仍然可以通过在线图上叠加散点图来实现结果.有关详细信息, 请参阅编辑历史记录

  • 您可以使用样式' - '调用一次情节,然后您可以使用样式'o'再次调用一个点的子集. (4认同)
  • 我知道那一部分.我想要做的只是标记某些要点.举个例子,我如何仅在第2点和第3点放置标记?对不起,如果我的问题在这方面不够清楚. (2认同)

Wub*_*ing 46

有一张图片显示所有标记的名称和描述,我希望它会对你有所帮助.

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()
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.tight_layout()
plt.axis('off')
plt.show()  
Run Code Online (Sandbox Code Playgroud)

例1 点击这里查看图片


los*_*ost 14

为了将来参考 - Line2D返回的艺术家plot()也有一种set_markevery()方法,允许您只在某些点设置标记 - 请参阅https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery

  • 是的,但不是在任意点 - 它必须是开始:停止:我认为步骤的子集... (2认同)

小智 6

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

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()
Run Code Online (Sandbox Code Playgroud)

结果是: 绘制多个标记

在此处输入图片说明