Markevery 演示#

markevery 属性 Line2D 允许在数据点的子集上绘制标记。

可能的参数列表在 Line2D.set_markevery 中指定。简而言之

  • 单个整数 N 绘制每 N 个标记。

  • 整数元组 (start, N) 从数据索引 *start* 开始绘制每 N 个标记。

  • 整数列表在指定索引处绘制标记。

  • 切片在切片索引处绘制标记。

  • 浮点数指定标记之间的距离,作为屏幕空间中 Axes 对角线的比例。这将导致在沿线的点上均匀分布标记,而与比例尺和缩放无关。

import matplotlib.pyplot as plt
import numpy as np

# define a list of markevery cases to plot
cases = [
    None,
    8,
    (30, 8),
    [16, 24, 32],
    [0, -1],
    slice(100, 200, 3),
    0.1,
    0.4,
    (0.2, 0.4)
]

# data points
delta = 0.11
x = np.linspace(0, 10 - 2 * delta, 200) + delta
y = np.sin(x) + 1.0 + delta

具有线性比例尺的 markevery#

fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)
markevery=None, markevery=8, markevery=(30, 8), markevery=[16, 24, 32], markevery=[0, -1], markevery=slice(100, 200, 3), markevery=0.1, markevery=0.4, markevery=(0.2, 0.4)

具有对数比例尺的 markevery#

请注意,当使用整数对数据进行二次采样时,对数比例尺会导致标记距离在视觉上不对称。相比之下,基于图形大小比例的二次采样会创建均匀分布,因为它基于 Axes 对角线的比例,而不是数据坐标或数据索引。

fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.set_xscale('log')
    ax.set_yscale('log')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)
markevery=None, markevery=8, markevery=(30, 8), markevery=[16, 24, 32], markevery=[0, -1], markevery=slice(100, 200, 3), markevery=0.1, markevery=0.4, markevery=(0.2, 0.4)

在缩放后的图形上使用 markevery#

基于整数的 *markevery* 规范从基础数据中选择点,并且与视图无关。相比之下,基于浮点数的规范与 Axes 对角线相关。虽然缩放不会更改 Axes 对角线,但会更改显示的数据范围,并且在缩放时将显示更多点。

fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)
    ax.set_xlim((6, 6.7))
    ax.set_ylim((1.1, 1.7))
markevery=None, markevery=8, markevery=(30, 8), markevery=[16, 24, 32], markevery=[0, -1], markevery=slice(100, 200, 3), markevery=0.1, markevery=0.4, markevery=(0.2, 0.4)

在极坐标图上使用 markevery#

r = np.linspace(0, 3.0, 200)
theta = 2 * np.pi * r

fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained',
                        subplot_kw={'projection': 'polar'})
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(theta, r, 'o', ls='-', ms=4, markevery=markevery)

plt.show()
markevery=None, markevery=8, markevery=(30, 8), markevery=[16, 24, 32], markevery=[0, -1], markevery=slice(100, 200, 3), markevery=0.1, markevery=0.4, markevery=(0.2, 0.4)

脚本的总运行时间:(0 分钟 12.615 秒)

由 Sphinx-Gallery 生成的图库