Matplotlib 中使用 annotate 绘制垂直文本的全面指南

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

参考:matplotlib annotate vertical text

MatplotlibPython 中最流行的数据可视化库之一,它提供了丰富的绘图功能。在数据可视化中,有时我们需要在图表上添加注释或标签来解释数据点或突出显示某些特征。annotate 函数是 Matplotlib 中用于添加注释的强大工具,而垂直文本则是一种特殊的注释形式,可以在空间受限或为了美观的情况下使用。本文将深入探讨如何在 Matplotlib 中使用 annotate 函数绘制垂直文本,并提供多个实用示例。

1. Matplotlib annotate 函数简介

annotate 函数是 Matplotlib 中用于在图表上添加注释的主要方法。它不仅可以添加文本,还可以绘制箭头指向特定的数据点。使用 annotate 函数可以灵活地控制注释的位置、样式和方向。

基本语法如下:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.annotate(text, xy, xytext=None, xycoords='data', textcoords='data', **kwargs)

参数说明:
text:要显示的注释文本
xy:被注释的点的坐标
xytext:注释文本的坐标(如果不指定,默认与 xy 相同)
xycoords:被注释点坐标系
textcoords:注释文本坐标系
**kwargs:其他可选参数,如字体大小、颜色等

让我们看一个简单的例子:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([0, 1, 2, 3, 4], [0, 2, 1, 3, 2])
ax.annotate('Peak', xy=(3, 3), xytext=(3.5, 3.5),
            arrowprops=dict(facecolor='black', shrink=0.05))
ax.set_title('How2matplotlib.com - Basic Annotation Example')
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们在坐标 (3, 3) 处添加了一个指向数据点的注释 “Peak”。注释文本位于 (3.5, 3.5),并用一个箭头指向数据点。

2. 垂直文本的实现方法

在 Matplotlib 中实现垂直文本主要有两种方法:

  1. 使用 rotation 参数
  2. 使用 verticalalignmenthorizontalalignment 参数

2.1 使用 rotation 参数

rotation 参数允许我们旋转文本。要创建垂直文本,我们可以将文本旋转 90 度或 270 度。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([0, 1, 2, 3, 4], [0, 2, 1, 3, 2])
ax.annotate('Vertical Text', xy=(2, 1), xytext=(2.2, 1.5),
            rotation=90, va='bottom')
ax.set_title('How2matplotlib.com - Vertical Text using rotation')
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们使用 rotation=90 将文本旋转 90 度,创建了一个向上的垂直文本。va='bottom' 确保文本从指定点向上延伸。

2.2 使用 verticalalignment 和 horizontalalignment 参数

另一种方法是使用 verticalalignmenthorizontalalignment 参数来控制文本的对齐方式。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([0, 1, 2, 3, 4], [0, 2, 1, 3, 2])
ax.annotate('Vertical\nText', xy=(1, 2), xytext=(1.2, 2.5),
            va='center', ha='center', rotation=90)
ax.set_title('How2matplotlib.com - Vertical Text with Alignment')
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们使用 va='center'ha='center' 来使文本在垂直和水平方向上居中对齐。rotation=90 仍然用于旋转文本。

3. 自定义垂直文本样式

Matplotlib 提供了多种方式来自定义注释文本的样式,包括字体、颜色、大小等。

3.1 更改字体样式

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([0, 1, 2, 3, 4], [0, 2, 1, 3, 2])
ax.annotate('Custom Font', xy=(3, 3), xytext=(3.2, 3.5),
            rotation=90, fontfamily='serif', fontweight='bold', fontsize=12)
ax.set_title('How2matplotlib.com - Custom Font Style')
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们使用 fontfamily='serif' 设置字体系列,fontweight='bold' 设置字体粗细,fontsize=12 设置字体大小。

3.2 添加背景和边框

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([0, 1, 2, 3, 4], [0, 2, 1, 3, 2])
ax.annotate('With Background', xy=(2, 1), xytext=(2.2, 1.5),
            rotation=90, va='bottom', bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='gray', alpha=0.7))
ax.set_title('How2matplotlib.com - Annotation with Background')
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

这个例子中,我们使用 bbox 参数添加了一个带有圆角的黄色背景和灰色边框。alpha=0.7 设置背景的透明度。

3.3 使用不同的颜色

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([0, 1, 2, 3, 4], [0, 2, 1, 3, 2])
ax.annotate('Colorful Text', xy=(1, 2), xytext=(1.2, 2.5),
            rotation=90, color='red', fontsize=14)
ax.set_title('How2matplotlib.com - Colorful Vertical Text')
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们使用 color='red' 将文本颜色设置为红色。

4. 在图表中使用多个垂直文本注释

在实际应用中,我们可能需要在图表的不同位置添加多个垂直文本注释。以下是一个更复杂的例子,展示了如何在一个图表中使用多个垂直文本注释:

import matplotlib.pyplot as plt
import numpy as np

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

# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 绘制曲线
ax.plot(x, y1, label='sin(x)')
ax.plot(x, y2, label='cos(x)')

# 添加垂直文本注释
ax.annotate('Peak', xy=(np.pi/2, 1), xytext=(np.pi/2+0.5, 1.1),
            rotation=90, va='bottom', color='red', fontweight='bold')
ax.annotate('Trough', xy=(3*np.pi/2, -1), xytext=(3*np.pi/2+0.5, -1.1),
            rotation=90, va='top', color='blue', fontweight='bold')
ax.annotate('Intersection', xy=(np.pi, 0), xytext=(np.pi+0.5, 0.1),
            rotation=90, va='bottom', color='green', fontweight='bold')

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('How2matplotlib.com - Multiple Vertical Text Annotations')
ax.legend()
ax.grid(True)

plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们绘制了正弦和余弦函数的图像,并在图表的不同位置添加了三个垂直文本注释,分别标注了波峰、波谷和交叉点。每个注释都使用了不同的颜色和位置,以突出显示不同的特征。

5. 在柱状图中使用垂直文本标签

垂直文本在柱状图中特别有用,尤其是当类别标签较长时。以下是一个在柱状图中使用垂直文本标签的例子:

import matplotlib.pyplot as plt
import numpy as np

categories = ['Category A', 'Category B', 'Category C', 'Category D', 'Category E']
values = [23, 45, 56, 78, 32]

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

# 添加垂直文本标签
for i, bar in enumerate(bars):
    height = bar.get_height()
    ax.text(bar.get_x() + bar.get_width()/2, height/2,
            categories[i], ha='center', va='center', rotation=90,
            color='white', fontweight='bold')

ax.set_ylabel('Values')
ax.set_title('How2matplotlib.com - Bar Chart with Vertical Labels')
plt.xticks([])  # 隐藏 x 轴刻度

plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们创建了一个简单的柱状图,并使用垂直文本作为每个柱子的标签。文本被放置在每个柱子的中心,并旋转 90 度。我们还隐藏了 x 轴的刻度,因为类别名称已经作为标签显示在柱子上。

6. 在散点图中使用垂直文本注释

散点图是另一种常见的图表类型,我们可以使用垂直文本注释来标注特定的数据点。以下是一个例子:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
x = np.random.rand(20)
y = np.random.rand(20)

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

# 添加垂直文本注释
for i in range(len(x)):
    if y[i] > 0.8:  # 只注释 y 值大于 0.8 的点
        ax.annotate(f'Point {i}', xy=(x[i], y[i]), xytext=(x[i]+0.02, y[i]+0.02),
                    rotation=90, va='bottom', fontsize=8,
                    arrowprops=dict(arrowstyle='->', color='red'))

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_title('How2matplotlib.com - Scatter Plot with Vertical Annotations')

plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们创建了一个散点图,并为 y 值大于 0.8 的点添加了垂直文本注释。每个注释包含点的索引,并使用箭头指向相应的数据点。

7. 在时间序列图中使用垂直文本

垂直文本在时间序列图中也非常有用,特别是当我们想要标注特定的时间点或事件时。以下是一个在时间序列图中使用垂直文本的例子:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 创建示例数据
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
values = np.cumsum(np.random.randn(len(dates))) + 100

fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(dates, values)

# 添加垂直文本注释
events = [
    ('2023-03-15', 'Event A'),
    ('2023-07-01', 'Event B'),
    ('2023-11-20', 'Event C')
]

for date, event in events:
    event_date = pd.to_datetime(date)
    event_value = values[dates == event_date][0]
    ax.annotate(event, xy=(event_date, event_value),
                xytext=(event_date, ax.get_ylim()[1]),
                rotation=90, va='top', ha='center',
                arrowprops=dict(arrowstyle='->', color='red'))

ax.set_xlabel('Date')
ax.set_ylabel('Value')
ax.set_title('How2matplotlib.com - Time Series with Vertical Event Labels')

plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们创建了一个时间序列图,并在特定的日期添加了垂直文本注释来标注重要事件。注释文本垂直放置在图表顶部,并用箭头指向相应的数据点。

8. 使用垂直文本创建自定义图例

有时,标准的图例可能不足以满足我们的需求。我们可以使用垂直文本创建自定义的图例。以下是一个例子:

import matplotlib.pyplot as plt
import numpy as np

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

# 绘制多条线
x = np.linspace(0, 10, 100)
for i in range(5):
    ax.plot(x, np.sin(x + i*0.5))

# 创建自定义垂直图例
legend_x = 10.5
for i in range(5):
    ax.text(legend_x, np.sin(legend_x + i*0.5), f'Line {i+1}',
            rotation=90, va='center', ha='left',
            bbox=dict(facecolor='white', edgecolor='none', alpha=0.7))

ax.set_xlim(0, 11)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_title('How2matplotlib.com - Custom Vertical Legend')

plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们绘制了多条正弦曲线,并在图表右侧创建了一个自定义的垂直图例。每个图例项都是一个垂直放置的文本,与相应的曲线颜色相匹配。

9. 在极坐标图中使用垂直文本

极坐标图是另一种可以受益于垂直文本的图表类型。以下是一个在极坐标图中使用垂直文本的例子:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection='polar'))

# 创建数据
theta = np.linspace(0, 2*np.pi, 8, endpoint=False)
radii = np.random.rand(8)*5
bars = ax.bar(theta, radii)

# 添加垂直文本标签
for angle, radius, bar in zip(theta, radii, bars):
    ax.text(angle, radius, f'{radius:.2f}', rotation=angle*180/np.pi - 90,
            ha='center', va='center')

ax.set_title('How2matplotlib.com - Polar Chart with Vertical Labels')
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们创建了一个极坐标图,并为每个数据点添加了垂直文本标签。文本的旋转角度根据极坐标的角度进行调整,以确保文本始终垂直于径向方向。

10. 在 3D 图中使用垂直文本

虽然在 3D 图中使用垂直文本可能比较复杂,但 Matplotlib 也提供了这种功能。以下是一个在 3D 散点图中使用垂直文本的例子:

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

fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 创建数据
n = 20
xs = np.random.rand(n)
ys = np.random.rand(n)
zs = np.random.rand(n)

# 绘制散点图
ax.scatter(xs, ys, zs)

# 添加垂直文本注释
for x, y, z in zip(xs, ys, zs):
    if z > 0.8:  # 只注释 z 值大于 0.8 的点
        ax.text(x, y, z, f'({x:.2f}, {y:.2f}, {z:.2f})',
                zdir='z', rotation=90, fontsize=8)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('How2matplotlib.com - 3D Scatter Plot with Vertical Labels')

plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们创建了一个 3D 散点图,并为 z 值大于 0.8 的点添加了垂直文本标签。文本沿 z 轴方向垂直放置,显示了每个点的坐标。

11. 使用垂直文本创建水印

垂直文本也可以用来创建水印效果。以下是一个在图表上添加垂直水印的例子:

import matplotlib.pyplot as plt
import numpy as np

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

# 绘制一些数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y)

# 添加垂直水印
ax.text(0.5, 0.5, 'How2matplotlib.com', transform=ax.transAxes,
        fontsize=40, color='gray', alpha=0.2,
        ha='center', va='center', rotation=90)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_title('Plot with Vertical Watermark')

plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们在图表中心添加了一个大型的、半透明的垂直文本作为水印。水印使用图表坐标系(transform=ax.transAxes),确保它始终位于图表的中心,不受数据范围的影响。

12. 在箱线图中使用垂直文本

箱线图是统计分析中常用的图表类型,我们可以使用垂直文本来增强其可读性。以下是一个在箱线图中使用垂直文本的例子:

import matplotlib.pyplot as plt
import numpy as np

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

# 创建数据
data = [np.random.normal(0, std, 100) for std in range(1, 6)]

# 绘制箱线图
box_plot = ax.boxplot(data, patch_artist=True)

# 添加垂直文本标签
for i, box in enumerate(box_plot['boxes']):
    color = box.get_facecolor()
    ax.text(i+1, ax.get_ylim()[1], f'Group {i+1}',
            rotation=90, va='top', ha='center',
            color=color, fontweight='bold')

ax.set_xlabel('Groups')
ax.set_ylabel('Values')
ax.set_title('How2matplotlib.com - Box Plot with Vertical Labels')

plt.xticks([])  # 隐藏 x 轴刻度
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们创建了一个包含多个组的箱线图,并使用垂直文本作为每个组的标签。文本的颜色与相应的箱体颜色相匹配,增强了视觉效果。

13. 在热力图中使用垂直文本

热力图是另一种可以通过垂直文本来增强可读性的图表类型。以下是一个在热力图中使用垂直文本的例子:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(10, 8))

# 创建数据
data = np.random.rand(10, 12)

# 绘制热力图
im = ax.imshow(data, cmap='YlOrRd')

# 添加垂直文本标签
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
          'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
for i, month in enumerate(months):
    ax.text(i, -0.5, month, rotation=90, va='top', ha='center')

ax.set_yticks(range(10))
ax.set_yticklabels([f'Category {i+1}' for i in range(10)])

ax.set_title('How2matplotlib.com - Heatmap with Vertical Month Labels')

plt.colorbar(im)
plt.tight_layout()
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们创建了一个热力图,并使用垂直文本来标注 x 轴的月份。这种方法在处理长标签或有限水平空间的情况下特别有用。

14. 在堆叠条形图中使用垂直文本

堆叠条形图是展示多个类别和子类别数据的有效方式。我们可以使用垂直文本来标注每个堆叠部分。以下是一个例子:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(12, 6))

# 创建数据
categories = ['A', 'B', 'C', 'D', 'E']
sub_categories = ['Sub1', 'Sub2', 'Sub3']
data = np.random.randint(10, 50, size=(len(categories), len(sub_categories)))

# 绘制堆叠条形图
bottom = np.zeros(len(categories))
for i, sub_cat in enumerate(sub_categories):
    values = data[:, i]
    p = ax.bar(categories, values, bottom=bottom, label=sub_cat)
    bottom += values

    # 添加垂直文本标签
    for j, rect in enumerate(p):
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width()/2, rect.get_y() + height/2,
                f'{sub_cat}: {values[j]}', ha='center', va='center',
                rotation=90, color='white', fontweight='bold')

ax.set_ylabel('Values')
ax.set_title('How2matplotlib.com - Stacked Bar Chart with Vertical Labels')
ax.legend(loc='upper right')

plt.tight_layout()
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们创建了一个堆叠条形图,并在每个堆叠部分的中心添加了垂直文本标签。标签包含子类别名称和相应的值,使图表更加信息丰富。

15. 在雷达图中使用垂直文本

雷达图(也称为蜘蛛图或星图)是比较多个定量变量的有效方式。我们可以使用垂直文本来标注每个轴。以下是一个例子:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection='polar'))

# 创建数据
categories = ['Speed', 'Power', 'Agility', 'Intelligence', 'Stamina', 'Luck']
values = np.random.randint(50, 100, len(categories))

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

# 绘制雷达图
ax.plot(angles, values)
ax.fill(angles, values, alpha=0.25)

# 添加垂直文本标签
for angle, category in zip(angles[:-1], categories):
    ax.text(angle, ax.get_rmax()*1.1, category,
            rotation=angle*180/np.pi - 90,
            ha='center', va='center')

ax.set_ylim(0, 100)
ax.set_yticks([20, 40, 60, 80])
ax.set_yticklabels(['20', '40', '60', '80'])
ax.set_xticks([])  # 隐藏径向刻度

ax.set_title('How2matplotlib.com - Radar Chart with Vertical Labels')

plt.tight_layout()
plt.show()

Output:

Matplotlib 中使用 annotate 绘制垂直文本的全面指南

在这个例子中,我们创建了一个雷达图,并使用垂直文本来标注每个类别轴。文本的旋转角度根据轴的角度进行调整,确保文本始终指向圆心。

结论

通过本文的详细探讨和丰富的示例,我们深入了解了如何在 Matplotlib 中使用 annotate 函数绘制垂直文本。从基本的文本旋转到复杂的图表注释,垂直文本为数据可视化提供了强大而灵活的工具。

垂直文本在多种图表类型中都有其独特的应用,包括但不限于:
– 柱状图和条形图的标签
– 散点图和时间序列图的注释
– 自定义图例
– 极坐标图和 3D 图的标注
– 水印效果
– 箱线图和热力图的标签
– 堆叠条形图的详细信息
– 雷达图的轴标签

通过合理使用垂直文本,我们可以在有限的空间内展示更多信息,提高图表的可读性和美观性。在实际应用中,根据具体需求和数据特性,灵活运用这些技巧可以大大提升数据可视化的效果。

记住,虽然垂直文本是一个强大的工具,但过度使用可能会使图表变得混乱。始终保持清晰和简洁的原则,确保垂直文本的使用能够增强而不是干扰图表的主要信息传达。

最后,Matplotlib 的灵活性意味着还有更多创新的方式来使用垂直文本。随着您对 Matplotlib 的深入了解,您可能会发现更多独特和有创意的应用方式。继续探索和实验,以充分发挥 Matplotlib 在数据可视化中的潜力。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程