标记参考 — Matplotlib 3.11.0 文档

Avatar
admin

标记参考#

Matplotlib 支持多种类别的标记,这些标记可以通过绘图命令中的 marker 参数进行选择。

未填充标记

填充标记

使用 TeX 符号创建的标记

使用路径(Paths)创建的标记

有关所有标记的列表,请参阅 matplotlib.markers 文档。

有关示例用法,请参阅 标记示例。

import matplotlib.pyplot as plt

from matplotlib.lines import Line2D

from matplotlib.markers import MarkerStyle

from matplotlib.transforms import Affine2D

text_style = dict(horizontalalignment='right', verticalalignment='center',

fontsize=12, fontfamily='monospace')

marker_style = dict(linestyle=':', color='0.8', markersize=10,

markerfacecolor="tab:blue", markeredgecolor="tab:blue")

def format_axes(ax):

ax.margins(0.2)

ax.set_axis_off()

ax.invert_yaxis()

def split_list(a_list):

i_half = len(a_list) // 2

return a_list[:i_half], a_list[i_half:]

未填充标记#

未填充的标记是单色的。

fig, axs = plt.subplots(ncols=2)

fig.suptitle('Un-filled markers', fontsize=14)

# Filter out filled markers and marker settings that do nothing.

unfilled_markers = [m for m, func in Line2D.markers.items()

if func != 'nothing' and m not in Line2D.filled_markers]

for ax, markers in zip(axs, split_list(unfilled_markers)):

for y, marker in enumerate(markers):

ax.text(-0.5, y, repr(marker), **text_style)

ax.plot([y] * 3, marker=marker, **marker_style)

format_axes(ax)

填充标记#

fig, axs = plt.subplots(ncols=2)

fig.suptitle('Filled markers', fontsize=14)

for ax, markers in zip(axs, split_list(Line2D.filled_markers)):

for y, marker in enumerate(markers):

ax.text(-0.5, y, repr(marker), **text_style)

ax.plot([y] * 3, marker=marker, **marker_style)

format_axes(ax)

标记填充样式#

填充标记的边缘颜色和填充颜色可以分别指定。此外,fillstyle 可以配置为不填充、完全填充或向不同方向半填充。半填充样式使用 markerfacecoloralt 作为辅助填充颜色。

fig, ax = plt.subplots()

fig.suptitle('Marker fillstyle', fontsize=14)

fig.subplots_adjust(left=0.4)

filled_marker_style = dict(marker='o', linestyle=':', markersize=15,

color='darkgrey',

markerfacecolor='tab:blue',

markerfacecoloralt='lightsteelblue',

markeredgecolor='brown')

for y, fill_style in enumerate(Line2D.fillStyles):

ax.text(-0.5, y, repr(fill_style), **text_style)

ax.plot([y] * 3, fillstyle=fill_style, **filled_marker_style)

format_axes(ax)

使用 TeX 符号创建的标记#

使用 MathText 来使用自定义标记符号,例如 "$\u266B$"。有关 STIX 字体符号的概览,请参考 STIX 字体表。另请参阅 STIX 字体。

fig, ax = plt.subplots()

fig.suptitle('Mathtext markers', fontsize=14)

fig.subplots_adjust(left=0.4)

marker_style.update(markeredgecolor="none", markersize=15)

markers = ["$1$", r"$\frac{1}{2}$", "$f$", "$\u266B$", r"$\mathcal{A}$"]

for y, marker in enumerate(markers):

# Escape dollars so that the text is written "as is", not as mathtext.

ax.text(-0.5, y, repr(marker).replace("$", r"\$"), **text_style)

ax.plot([y] * 3, marker=marker, **marker_style)

format_axes(ax)

使用路径(Paths)创建的标记#

任何 Path 都可以用作标记。以下示例展示了两个简单的路径(星形和圆形),以及一个更复杂的带有镂空星形的圆形路径。

import numpy as np

import matplotlib.path as mpath

star = mpath.Path.unit_regular_star(6)

circle = mpath.Path.unit_circle()

# concatenate the circle with an internal cutout of the star

cut_star = mpath.Path(

vertices=np.concatenate([circle.vertices, star.vertices[::-1, ...]]),

codes=np.concatenate([circle.codes, star.codes]))

fig, ax = plt.subplots()

fig.suptitle('Path markers', fontsize=14)

fig.subplots_adjust(left=0.4)

markers = {'star': star, 'circle': circle, 'cut_star': cut_star}

for y, (name, marker) in enumerate(markers.items()):

ax.text(-0.5, y, name, **text_style)

ax.plot([y] * 3, marker=marker, **marker_style)

format_axes(ax)

利用变换(transform)进行高级标记修改#

可以通过将变换传递给 MarkerStyle 构造函数来修改标记。以下示例展示了如何将提供的旋转应用于多个标记形状。

common_style = {k: v for k, v in filled_marker_style.items() if k != 'marker'}

angles = [0, 10, 20, 30, 45, 60, 90]

fig, ax = plt.subplots()

fig.suptitle('Rotated markers', fontsize=14)

ax.text(-0.5, 0, 'Filled marker', **text_style)

for x, theta in enumerate(angles):

t = Affine2D().rotate_deg(theta)

ax.plot(x, 0, marker=MarkerStyle('o', 'left', t), **common_style)

ax.text(-0.5, 1, 'Un-filled marker', **text_style)

for x, theta in enumerate(angles):

t = Affine2D().rotate_deg(theta)

ax.plot(x, 1, marker=MarkerStyle('1', 'left', t), **common_style)

ax.text(-0.5, 2, 'Equation marker', **text_style)

for x, theta in enumerate(angles):

t = Affine2D().rotate_deg(theta)

eq = r'$\frac{1}{x}$'

ax.plot(x, 2, marker=MarkerStyle(eq, 'left', t), **common_style)

for x, theta in enumerate(angles):

ax.text(x, 2.5, f"{theta}°", horizontalalignment="center")

format_axes(ax)

fig.tight_layout()

设置标记端点样式和连接样式#

标记具有默认的端点和连接样式,但在创建 MarkerStyle 时可以自定义这些样式。

from matplotlib.markers import CapStyle, JoinStyle

marker_inner = dict(markersize=35,

markerfacecolor='tab:blue',

markerfacecoloralt='lightsteelblue',

markeredgecolor='brown',

markeredgewidth=8,

)

marker_outer = dict(markersize=35,

markerfacecolor='tab:blue',

markerfacecoloralt='lightsteelblue',

markeredgecolor='white',

markeredgewidth=1,

)

fig, ax = plt.subplots()

fig.suptitle('Marker CapStyle', fontsize=14)

fig.subplots_adjust(left=0.1)

for y, cap_style in enumerate(CapStyle):

ax.text(-0.5, y, cap_style.name, **text_style)

for x, theta in enumerate(angles):

t = Affine2D().rotate_deg(theta)

m = MarkerStyle('1', transform=t, capstyle=cap_style)

ax.plot(x, y, marker=m, **marker_inner)

ax.plot(x, y, marker=m, **marker_outer)

ax.text(x, len(CapStyle) - .5, f'{theta}°', ha='center')

format_axes(ax)

修改连接样式

fig, ax = plt.subplots()

fig.suptitle('Marker JoinStyle', fontsize=14)

fig.subplots_adjust(left=0.05)

for y, join_style in enumerate(JoinStyle):

ax.text(-0.5, y, join_style.name, **text_style)

for x, theta in enumerate(angles):

t = Affine2D().rotate_deg(theta)

m = MarkerStyle('*', transform=t, joinstyle=join_style)

ax.plot(x, y, marker=m, **marker_inner)

ax.text(x, len(JoinStyle) - .5, f'{theta}°', ha='center')

format_axes(ax)

plt.show()

标签:组件:标记 目的:参考

脚本总运行时间:(0 分 2.390 秒)

下载 Jupyter 笔记本: marker_reference.ipynb

下载 Python 源代码: marker_reference.py

下载 压缩包: marker_reference.zip

由 Sphinx-Gallery 生成的画廊