Matplotlib 标记:如何使用和自定义数据点标记

Matplotlib 标记:如何使用和自定义数据点标记

参考:matplotlib markers

MatplotlibPython 中最流行的数据可视化库之一,它提供了丰富的绘图功能。在绘制散点图、折线图等图表时,标记(markers)是一个非常重要的元素,它可以帮助我们更好地区分不同的数据点或数据系列。本文将详细介绍 Matplotlib 中的标记使用方法,包括内置标记、自定义标记、标记大小和颜色设置等内容。

1. Matplotlib 标记简介

在 Matplotlib 中,标记是用来表示数据点的符号。它们可以是简单的几何形状,如圆点、方块、三角形等,也可以是更复杂的符号,如星形或自定义形状。标记通常用于以下场景:

  1. 散点图:用不同的标记表示不同类别的数据点
  2. 折线图:在数据点位置添加标记,以便更容易识别具体的数据点
  3. 多系列图表:使用不同的标记区分不同的数据系列

使用标记可以增强图表的可读性和美观性,让数据更加直观。

2. 内置标记类型

Matplotlib 提供了多种内置的标记类型,可以通过字符串简写来指定。以下是一些常用的内置标记类型:

  • ‘o’: 圆点
  • ‘s’: 方块
  • ‘^’: 上三角形
  • ‘v’: 下三角形
  • ‘D’: 菱形
  • ‘*’: 星形
  • ‘+’: 加号
  • ‘x’: 叉号

让我们通过一个简单的示例来展示如何使用这些内置标记:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 10)
y = np.sin(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y, 'o-', label='Circle')
plt.plot(x, y + 0.5, 's-', label='Square')
plt.plot(x, y - 0.5, '^-', label='Triangle')
plt.title('How to use markers in Matplotlib - how2matplotlib.com')
plt.legend()
plt.grid(True)
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个示例中,我们绘制了三条正弦曲线,分别使用了圆点、方块和三角形作为标记。通过在 plot() 函数的格式字符串中指定标记类型(如 ‘o-‘),我们可以同时设置线型和标记类型。

3. 自定义标记大小和颜色

除了选择标记类型,我们还可以自定义标记的大小和颜色。这可以通过 markersizemarkerfacecolor/markeredgecolor 参数来实现。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 5, 10)
y = x ** 2

plt.figure(figsize=(10, 6))
plt.plot(x, y, 'o', markersize=12, markerfacecolor='red', markeredgecolor='blue', label='Custom Marker')
plt.title('Custom Marker Size and Color - how2matplotlib.com')
plt.legend()
plt.grid(True)
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们设置了较大的标记大小(markersize=12),红色的标记填充色(markerfacecolor='red')和蓝色的标记边缘色(markeredgecolor='blue')。这样可以使标记更加突出和个性化。

4. 使用不同标记绘制多系列数据

当我们需要在同一张图表中绘制多个数据系列时,使用不同的标记可以帮助区分它们。以下是一个示例:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 50)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)

plt.figure(figsize=(12, 6))
plt.plot(x, y1, 'o-', label='Sin')
plt.plot(x, y2, 's-', label='Cos')
plt.plot(x, y3, '^-', label='Tan')
plt.title('Multiple Series with Different Markers - how2matplotlib.com')
plt.legend()
plt.grid(True)
plt.ylim(-2, 2)  # 限制 y 轴范围,以便更好地显示
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们使用了圆点、方块和三角形分别表示正弦、余弦和正切函数。这样可以在图例中清楚地区分不同的数据系列。

5. 自定义标记样式

除了使用内置的标记类型,Matplotlib 还允许我们创建自定义的标记样式。这可以通过 MarkerStyle 类来实现。以下是一个创建自定义五角星标记的例子:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.markers import MarkerStyle

x = np.linspace(0, 5, 10)
y = x ** 2

custom_marker = MarkerStyle('*', fillstyle='full')

plt.figure(figsize=(10, 6))
plt.plot(x, y, marker=custom_marker, markersize=20, linestyle='None', label='Custom Star Marker')
plt.title('Custom Marker Style - how2matplotlib.com')
plt.legend()
plt.grid(True)
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们创建了一个填充的五角星标记,并将其大小设置为 20。通过设置 linestyle='None',我们只显示标记而不显示连接线。

6. 标记填充样式

Matplotlib 提供了多种标记填充样式,可以通过 fillstyle 参数来设置。常用的填充样式包括:

  • ‘full’: 完全填充
  • ‘none’: 不填充(只有轮廓)
  • ‘left’: 左半部分填充
  • ‘right’: 右半部分填充
  • ‘top’: 上半部分填充
  • ‘bottom’: 下半部分填充

让我们通过一个例子来展示这些填充样式:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(6)
y = np.arange(6)

fill_styles = ['full', 'none', 'left', 'right', 'top', 'bottom']

plt.figure(figsize=(12, 6))
for i, style in enumerate(fill_styles):
    plt.plot(x, y + i, 'o', fillstyle=style, markersize=15, label=f'fillstyle="{style}"')

plt.title('Marker Fill Styles - how2matplotlib.com')
plt.legend()
plt.grid(True)
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

这个例子展示了不同的标记填充样式,使用较大的标记大小以便更清楚地观察效果。

7. 在散点图中使用标记

散点图是使用标记的最常见场景之一。我们可以使用 scatter() 函数来创建散点图,并自定义标记的各种属性。以下是一个示例:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50)

plt.figure(figsize=(10, 8))
scatter = plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, marker='o')
plt.colorbar(scatter)
plt.title('Scatter Plot with Custom Markers - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们创建了一个散点图,其中:
– 标记的颜色由 colors 数组决定
– 标记的大小由 sizes 数组决定
– 标记的透明度设置为 0.5
– 使用圆形标记 ‘o’

我们还添加了一个颜色条来显示颜色映射。

8. 在 3D 图中使用标记

Matplotlib 也支持在 3D 图中使用标记。以下是一个在 3D 散点图中使用标记的例子:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

np.random.seed(42)
n = 100
x = np.random.rand(n)
y = np.random.rand(n)
z = np.random.rand(n)
colors = np.random.rand(n)
sizes = 100 * np.random.rand(n)

fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(x, y, z, c=colors, s=sizes, alpha=0.6, marker='o')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')
plt.colorbar(scatter)
plt.title('3D Scatter Plot with Markers - how2matplotlib.com')
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

这个例子创建了一个 3D 散点图,使用了不同大小和颜色的圆形标记来表示数据点。

9. 使用图像作为标记

Matplotlib 还允许我们使用自定义图像作为标记。这在某些特殊场景下非常有用,比如在地图上标记位置时使用小图标。以下是一个使用自定义图像作为标记的例子:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.offsetbox import OffsetImage, AnnotationBbox

def getImage(path, zoom=1):
    return OffsetImage(plt.imread(path), zoom=zoom)

# 假设我们有一个名为 'custom_marker.png' 的图像文件
x = [1, 2, 3, 4, 5]
y = [2, 3, 1, 4, 2]

fig, ax = plt.subplots(figsize=(10, 6))
ax.scatter(x, y)

for x0, y0 in zip(x, y):
    ab = AnnotationBbox(getImage('custom_marker.png', zoom=0.1), (x0, y0), frameon=False)
    ax.add_artist(ab)

ax.set_xlim(0, 6)
ax.set_ylim(0, 5)
plt.title('Custom Image Markers - how2matplotlib.com')
plt.show()

在这个例子中,我们假设有一个名为 ‘custom_marker.png’ 的图像文件。我们使用 AnnotationBbox 将这个图像作为标记添加到散点图中。注意,你需要替换 ‘custom_marker.png’ 为实际的图像文件路径。

10. 动态更新标记

在某些情况下,我们可能需要动态更新图表中的标记。以下是一个简单的动画示例,展示如何动态更新标记的位置和大小:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots(figsize=(10, 6))
x = np.linspace(0, 2*np.pi, 100)
line, = ax.plot(x, np.sin(x), 'o-')

def update(frame):
    y = np.sin(x + frame/10)
    sizes = 50 + 25 * np.sin(frame/5 + x)
    line.set_ydata(y)
    line.set_markersize(sizes)
    return line,

ani = FuncAnimation(fig, update, frames=100, interval=50, blit=True)
plt.title('Dynamic Marker Update - how2matplotlib.com')
plt.show()

这个例子创建了一个动画,其中正弦波的相位和标记大小随时间变化。注意,要运行这个动画,你可能需要安装额外的依赖,如 Pillow

11. 在箱线图中使用标记

箱线图(Box Plot)是另一种可以使用标记的图表类型。我们可以自定义离群点的标记样式。以下是一个例子:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

fig, ax = plt.subplots(figsize=(10, 6))
bp = ax.boxplot(data, patch_artist=True)

for element in ['boxes', 'whiskers', 'fliers', 'means', 'medians', 'caps']:
    plt.setp(bp[element], color='blue')

plt.setp(bp['fliers'], marker='o', markersize=8, markerfacecolor='red', markeredgecolor='black')

plt.title('Box Plot with Custom Markers for Outliers - how2matplotlib.com')
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们自定义了箱线图的颜色,并特别设置了离群点(fliers)的标记样式。离群点使用红色填充、黑色边缘的圆形标记表示。

12. 在误差条中使用标记

当绘制带有误差条的图表时,我们也可以自定义数据点的标记。以下是一个示例:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 50)
y = np.sin(x)
yerr = 0.1 + 0.2 * np.random.rand(len(x))

plt.figure(figsize=(10, 6))
plt.errorbar(x, y, yerr=yerr, fmt='o', markersize=8, capsize=5, 
             markerfacecolor='red', markeredgecolor='black', ecolor='gray')
plt.title('Error Bars with Custom Markers - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.grid(True)
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们使用 errorbar() 函数绘制了带有误差条的数据点。我们自定义了数据点的标记样式,使用红色填充、黑色边缘的圆形标记,并设置了误差条的颜色和样式。

13. 在极坐标图中使用标记

Matplotlib 也支持在极坐标图中使用标记。以下是一个在极坐标系中绘制螺旋线并使用自定义标记的例子:

import matplotlib.pyplot as plt
import numpy as np

theta = np.linspace(0, 4*np.pi, 100)
r = theta**2

fig, ax = plt.subplots(figsize=(10, 10), subplot_kw=dict(projection='polar'))
ax.plot(theta, r, marker='o', markersize=8, markerfacecolor='green', markeredgecolor='black')
ax.set_title('Polar Plot with Custom Markers - how2matplotlib.com')
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

这个例子在极坐标系中绘制了一条螺旋线,并在数据点处使用了绿色填充、黑色边缘的圆形标记。

14. 使用标记绘制向量场

在绘制向量场时,我们可以使用标记来表示向量的起点或终点。以下是一个简单的向量场示例:

import matplotlib.pyplot as plt
import numpy as np

x, y = np.meshgrid(np.arange(-2, 2, 0.2), np.arange(-2, 2, 0.2))
u = x
v = y

fig, ax = plt.subplots(figsize=(10, 10))
ax.quiver(x, y, u, v, scale=10, scale_units='xy', angles='xy', color='blue', 
          pivot='tip', headwidth=4, headlength=6)
ax.scatter(x, y, color='red', s=10, zorder=2)
ax.set_xlim(-2.5, 2.5)
ax.set_ylim(-2.5, 2.5)
ax.set_title('Vector Field with Markers - how2matplotlib.com')
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们使用 quiver() 函数绘制向量场,并使用 scatter() 函数在向量起点添加红色的小圆点标记。

15. 在热图中使用标记

虽然热图通常不使用标记,但在某些情况下,我们可能想在热图的特定位置添加标记。以下是一个在热图中添加标记的例子:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.rand(10, 10)
x, y = np.where(data > 0.9)

fig, ax = plt.subplots(figsize=(10, 8))
im = ax.imshow(data, cmap='viridis')
ax.scatter(y, x, color='red', s=100, marker='*')
plt.colorbar(im)
ax.set_title('Heatmap with Markers - how2matplotlib.com')
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们创建了一个随机数据的热图,并在数值大于 0.9 的位置添加了红色星形标记。

16. 在等高线图中使用标记

在绘制等高线图时,我们可以使用标记来突出显示特定的点。以下是一个在等高线图中添加标记的例子:

import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
    return np.sin(np.sqrt(x ** 2 + y ** 2))

x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)

fig, ax = plt.subplots(figsize=(10, 8))
cs = ax.contourf(X, Y, Z, cmap='viridis')
ax.contour(X, Y, Z, colors='black', linewidths=0.5)
ax.scatter([0], [0], color='red', s=100, marker='*')
plt.colorbar(cs)
ax.set_title('Contour Plot with Marker - how2matplotlib.com')
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们绘制了一个二维函数的等高线图,并在原点(0, 0)处添加了一个红色星形标记。

17. 在柱状图中使用标记

虽然柱状图通常不使用标记,但我们可以在柱子顶部添加标记来强调某些数据点。以下是一个在柱状图中使用标记的例子:

import matplotlib.pyplot as plt
import numpy as np

categories = ['A', 'B', 'C', 'D', 'E']
values = np.random.randint(1, 10, size=5)

fig, ax = plt.subplots(figsize=(10, 6))
bars = ax.bar(categories, values, color='skyblue')

for bar in bars:
    height = bar.get_height()
    ax.text(bar.get_x() + bar.get_width()/2., height,
            f'{height}', ha='center', va='bottom')
    ax.plot(bar.get_x() + bar.get_width()/2., height, marker='*', 
            markersize=15, color='red', zorder=3)

ax.set_title('Bar Chart with Markers - how2matplotlib.com')
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们创建了一个简单的柱状图,并在每个柱子的顶部添加了一个红色星形标记和数值标签。

18. 在饼图中使用标记

虽然饼图本身不使用标记,但我们可以在饼图的标签线上添加标记。以下是一个在饼图中使用标记的例子:

import matplotlib.pyplot as plt

sizes = [30, 25, 20, 15, 10]
labels = ['A', 'B', 'C', 'D', 'E']
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue', 'lightgreen']
explode = (0.1, 0, 0, 0, 0)

fig, ax = plt.subplots(figsize=(10, 8))
wedges, texts, autotexts = ax.pie(sizes, explode=explode, labels=labels, colors=colors,
                                  autopct='%1.1f%%', startangle=90)

for autotext in autotexts:
    autotext.set_color('white')

for wedge in wedges:
    ang = (wedge.theta2 + wedge.theta1) / 2.
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    ax.plot(x*1.3, y*1.3, marker='o', color='black', markersize=8)

ax.set_title('Pie Chart with Markers - how2matplotlib.com')
plt.show()

在这个例子中,我们创建了一个饼图,并在每个扇形的标签线末端添加了一个黑色圆点标记。

19. 在雷达图中使用标记

雷达图(也称为蜘蛛图或星图)是另一种可以使用标记的图表类型。以下是一个在雷达图中使用标记的例子:

import matplotlib.pyplot as plt
import numpy as np

categories = ['A', 'B', 'C', 'D', 'E', 'F']
values = [4, 3, 5, 2, 4, 3]

angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False)
values = np.concatenate((values, [values[0]]))  # 闭合多边形
angles = np.concatenate((angles, [angles[0]]))  # 闭合多边形

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection='polar'))
ax.plot(angles, values, 'o-', linewidth=2)
ax.fill(angles, values, alpha=0.25)
ax.set_thetagrids(angles[:-1] * 180/np.pi, categories)
ax.set_title('Radar Chart with Markers - how2matplotlib.com')
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们创建了一个简单的雷达图,并在每个数据点处使用了圆形标记。

20. 在树状图中使用标记

最后,让我们看一个在树状图(Dendrogram)中使用标记的例子。虽然树状图通常不使用标记,但我们可以在叶节点添加标记来强调某些数据点:

import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
import numpy as np

np.random.seed(42)
X = np.random.rand(10, 2)
Z = linkage(X, 'ward')

fig, ax = plt.subplots(figsize=(10, 7))
dendrogram(Z, leaf_rotation=90, leaf_font_size=8)

for i, d in zip(ax.get_xticks(), ax.get_xticklabels()):
    ax.plot(i, 0, marker='o', color='red', markersize=8, zorder=3)

ax.set_title('Dendrogram with Markers - how2matplotlib.com')
plt.tight_layout()
plt.show()

Output:

Matplotlib 标记:如何使用和自定义数据点标记

在这个例子中,我们创建了一个简单的树状图,并在每个叶节点的位置添加了红色圆点标记。

总结

通过以上 20 个详细的示例,我们全面介绍了 Matplotlib 中标记的使用方法。从基本的标记类型和自定义,到在各种不同类型的图表中应用标记,我们探索了标记在数据可视化中的多种用途。标记不仅可以帮助区分不同的数据点或数据系列,还能增强图表的可读性和美观性。

在实际应用中,选择合适的标记类型、大小和颜色对于有效传达数据信息至关重要。通过灵活运用这些技巧,你可以创建出更加清晰、直观和专业的数据可视化图表。

记住,虽然标记是强大的可视化工具,但过度使用可能会导致图表变得杂乱。始终要根据你的数据和目标受众来平衡使用标记的数量和样式。通过实践和经验,你将能够掌握在各种场景下恰当使用标记的技巧,从而制作出既美观又富有洞察力的数据可视化作品。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程