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


174

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

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


2
:为弧长标记间距相关的解决方案stackoverflow.com/questions/17406758/...
扬FILIPPIDIS

Answers:


324

在调用中指定关键字args linestyle和/或。markerplot

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

plt.plot(range(10), linestyle='--', marker='o', color='b')

相同内容的快捷方式调用:

plt.plot(range(10), '--bo')

例子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
================    ===============================

编辑: 以标记点的任意子集为例,如注释中所要求:

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

例子2

markevery由于此功能分支的合并,从1.4+开始,使用kwarg的最后一个示例是可能的。如果您坚持使用较旧版本的matplotlib,则仍可以通过在散点图上覆盖散点图来获得结果。有关更多详细信息,请参见编辑历史记录


2
我知道那部分。我想做的只是标记某些点。以您的示例为例,例如,我将如何仅在第二和第三点上放置标记?抱歉,如果我在这方面的问题不够清楚。
dbmikus

4
您可以使用样式“-”调用一次绘图,然后可以使用“ o”样式再次调用点的子集。
2011年

我是否会迭代提供给绘图的值,并使用标记创建一个断开的点子图?然后将它们放在前一行的顶部?还是有一种更清洁的方法?我这样做很好,但是我想用最可接受的方式编写代码。
dbmikus 2011年

1
不,不要使用循环,因为画布上的艺术家过多,可能真的很慢。使用原始输入的一部分。
2011年

@AbidRahmanK您也可以通过查看所有可用的标记matplotlib.markers.MarkerStyle.markers,该标记返回类似于上述wim的字典。
joelostblom '16

54

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

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

例子1


14

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


2
没错,但不是任意点-它必须启动:STOP:步排序的子集我想..
维姆

我的印象是以上两个帖子都回答了这个问题。原因是它们解决了两个不同的问题。术语“标记”通常是指曲线的样式。因此,隐含一个常规规则(例如,每10个规则)。如果要选择一些“任意”点子集,请考虑将其作为单独的曲线,而不是原始曲线上的标记。它只是一条带有标记的不同曲线。因此,您必须手动选择这些点。这个主题很有趣并且更深入,在发布相关代码之后,将在以后的文章中发表更多评论。
Ioannis Filippidis

1
@wim有一个PR有望将其变成1.4,从而可以标记任意点github.com/matplotlib/matplotlib/pull/2662
tacaswell 2014年

1

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

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

结果是: 用多个标记绘制

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.