当前位置: 代码网 > it编程>编程语言>Java > 使用Matplotlib实现自定义坐标轴字体及刻度样式详解

使用Matplotlib实现自定义坐标轴字体及刻度样式详解

2026年01月03日 Java 我要评论
引言在数据可视化中,坐标轴标签和刻度标签的呈现方式直接影响图表的可读性和美观性。matplotlib 作为 python 中最流行的绘图库,提供了丰富的接口来自定义坐标轴的视觉样式。本文将详细介绍如何

引言

在数据可视化中,坐标轴标签和刻度标签的呈现方式直接影响图表的可读性和美观性。matplotlib 作为 python 中最流行的绘图库,提供了丰富的接口来自定义坐标轴的视觉样式。本文将详细介绍如何设置坐标轴标题的字体样式、如何正确显示负号,以及如何自定义坐标轴刻度标签的多种方法。每个示例代码块都是独立的,读者可以直接复制运行。

坐标轴标题字体设置

matplotlib 中设置坐标轴标题字体的方法有多种,每种方法适用于不同的场景。以下是几种常用的设置方式。

通过 fontdict 参数设置

fontdict 参数允许我们通过字典来指定字体属性,包括字体族、大小、粗细、样式和颜色等。这种方法提供了最全面的控制。

import matplotlib.pyplot as plt
import numpy as np

# 创建示例数据
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, y, linewidth=2)

# 使用fontdict设置字体属性
ax.set_xlabel('time (s)', 
              fontdict={
                  'family': 'times new roman',  # 字体名称
                  'size': 16,                   # 字体大小
                  'weight': 'bold',             # 字体粗细
                  'style': 'italic',            # 字体样式
                  'color': 'darkblue'           # 字体颜色
              })

ax.set_ylabel('amplitude', 
              fontdict={
                  'family': 'arial',
                  'size': 14,
                  'weight': 'normal',
                  'color': 'darkred'
              })

ax.set_title('sine wave: $y = \\sin(x)$', fontsize=18, fontweight='bold')
plt.tight_layout()
plt.show()

通过关键字参数设置

对于简单的字体设置,可以直接使用关键字参数,代码更加简洁直观。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.exp(-x/5) * np.cos(2*x)

fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, y, 'r-', linewidth=2)

# 使用关键字参数设置字体
ax.set_xlabel('time (seconds)', 
              fontsize=14,
              fontweight='bold',
              fontstyle='normal',
              fontfamily='dejavu sans',
              color='navy')

ax.set_ylabel('signal strength', 
              fontsize=14,
              fontweight='semibold',
              fontfamily='helvetica',
              color='darkgreen')

ax.set_title('damped oscillation', 
             fontsize=16,
             fontweight='bold',
             fontfamily='times new roman')

plt.grid(true, alpha=0.3)
plt.tight_layout()
plt.show()

通过 text 对象设置

获取坐标轴标签的 text 对象后,可以直接修改其属性。这种方法特别适合在创建标签后需要进行动态调整的场景。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5, 200)
y = np.exp(-x**2/2) / np.sqrt(2*np.pi)

fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, y, 'b-', linewidth=2, alpha=0.7)

# 获取 text 对象
xlabel = ax.set_xlabel('$x$ (input variable)')
ylabel = ax.set_ylabel('$f(x)$', rotation=0)

# 通过 text 对象的方法设置属性
xlabel.set_fontsize(15)
xlabel.set_fontweight('bold')
xlabel.set_fontfamily('times new roman')
xlabel.set_color('darkblue')
xlabel.set_style('italic')

ylabel.set_fontsize(15)
ylabel.set_fontweight('bold')
ylabel.set_fontfamily('times new roman')
ylabel.set_color('darkred')
ylabel.set_verticalalignment('center')
ylabel.set_position((0, 0.5))  # 调整标签位置

ax.set_title('normal distribution: $f(x) = \\frac{1}{\\sqrt{2\\pi}} e^{-x^2/2}$',
             fontsize=16, fontweight='bold')

plt.grid(true, alpha=0.2, linestyle='--')
plt.tight_layout()
plt.show()

通过 rcparams 全局设置

当需要在整个项目或会话中保持一致的字体样式时,可以使用 rcparams 进行全局设置。

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

# 配置全局设置
matplotlib.rcparams.update({
    'axes.labelsize': 16,
    'axes.labelweight': 'bold',
    'axes.labelcolor': 'black',
    'axes.titlecolor': 'darkblue',
    'axes.titlesize': 18,
    'axes.titleweight': 'bold',
    'font.family': 'sans-serif',
    'font.sans-serif': ['arial', 'dejavu sans', 'helvetica']
})

# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

x = np.linspace(0, 4*np.pi, 200)

# 绘制不同的三角函数
functions = [('sin', np.sin), ('cos', np.cos), 
             ('tan', np.tan), ('sinc', lambda x: np.sin(x)/x)]

for ax, (name, func) in zip(axes.flat, functions):
    y = func(x)
    ax.plot(x, y, linewidth=2)
    ax.set_xlabel('$x$ (radians)')
    ax.set_ylabel(f'${name}(x)$')
    ax.set_title(f'${name}(x)$ function')
    ax.grid(true, alpha=0.3)
    
    # 对正切函数设置显示范围,避免极端值
    if name == 'tan':
        ax.set_ylim(-5, 5)

plt.tight_layout()
plt.show()

# 重置为默认设置
matplotlib.rcparams.update(matplotlib.rcparamsdefault)

正确显示负号

在使用某些字体(特别是中文字体)时,负号可能无法正确显示。以下是解决此问题的几种方法。

基本配置

设置 axes.unicode_minusfalse 是解决负号显示问题的关键。

import matplotlib.pyplot as plt
import numpy as np

# 解决负号显示问题的基本配置
plt.rcparams['font.sans-serif'] = ['arial', 'dejavu sans', 'helvetica']
plt.rcparams['axes.unicode_minus'] = false  # 关键设置

# 创建包含负值的数据
x = np.linspace(-2*np.pi, 2*np.pi, 300)
y1 = np.sin(x)
y2 = np.cos(x)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 第一个子图:正弦函数
ax1.plot(x, y1, 'b-', linewidth=2)
ax1.set_xlabel('angle (radians)')
ax1.set_ylabel('$\\sin(\\theta)$')
ax1.set_title('sine function with negative domain')
ax1.grid(true, alpha=0.3)
ax1.axhline(y=0, color='black', linewidth=0.5, linestyle='-')
ax1.axvline(x=0, color='black', linewidth=0.5, linestyle='-')

# 第二个子图:余弦函数
ax2.plot(x, y2, 'r-', linewidth=2)
ax2.set_xlabel('angle (radians)')
ax2.set_ylabel('$\\cos(\\theta)$')
ax2.set_title('cosine function with negative domain')
ax2.grid(true, alpha=0.3)
ax2.axhline(y=0, color='black', linewidth=0.5, linestyle='-')
ax2.axvline(x=0, color='black', linewidth=0.5, linestyle='-')

plt.tight_layout()
plt.show()

包含科学记数法的负值显示

当数据范围很大或很小时,科学记数法中的负号也需要正确显示。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import funcformatter

# 配置以正确显示负号
plt.rcparams['axes.unicode_minus'] = false
plt.rcparams['font.size'] = 12

# 创建包含较大负值的数据
x = np.logspace(-3, 3, 200)  # 从 $10^{-3}$ 到 $10^{3}$
y = -np.exp(-x) * np.sin(10*x)

fig, ax = plt.subplots(figsize=(10, 6))
ax.semilogx(x, y, linewidth=2, color='purple')

# 使用科学记数法格式化刻度标签
formatter = funcformatter(lambda val, pos: f'{val:.1e}')
ax.xaxis.set_major_formatter(formatter)
ax.yaxis.set_major_formatter(formatter)

# 自定义刻度参数
ax.tick_params(axis='both', which='major', labelsize=11)
ax.tick_params(axis='both', which='minor', labelsize=9)

ax.set_xlabel('time (s)', fontsize=14, fontweight='bold')
ax.set_ylabel('amplitude (v)', fontsize=14, fontweight='bold')
ax.set_title('exponential decay with oscillation: $y = -e^{-x}\\sin(10x)$', 
             fontsize=16, fontweight='bold')

ax.grid(true, alpha=0.3, which='both', linestyle='--')

# 添加包含负值的文本标注
ax.text(0.1, -0.7, 'minimum value: $-0.5\\times10^{0}$', 
        fontsize=12, bbox=dict(boxstyle='round', facecolor='yellow', alpha=0.5))

plt.tight_layout()
plt.show()

坐标轴刻度字体设置

坐标轴刻度标签的字体设置同样重要,matplotlib 提供了多种方法来定制刻度标签的外观。

通过 tick_params 方法设置

tick_params 方法是最常用的设置刻度标签样式的方法,它可以同时设置多个属性。

import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体和负号显示
plt.rcparams['font.sans-serif'] = ['simhei', 'microsoft yahei', 'dejavu sans']
plt.rcparams['axes.unicode_minus'] = false

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

fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y, linewidth=2)

# 设置刻度字体
ax.tick_params(axis='both',           # 同时设置 x 和 y 轴
               labelsize=12,          # 刻度标签大小
               labelcolor='darkblue', # 刻度标签颜色
               rotation=0)           # 刻度标签旋转角度

# 或者分别设置 x 轴和 y 轴
ax.tick_params(axis='x', labelsize=14, labelcolor='red', rotation=45)
ax.tick_params(axis='y', labelsize=12, labelcolor='green')

ax.set_xlabel('x轴标题', fontsize=14)
ax.set_ylabel('y轴标题', fontsize=14)
ax.set_title('刻度字体设置示例', fontsize=16)
plt.tight_layout()
plt.show()

通过 set_xticklabels 和 set_yticklabels 设置

这种方法可以更精细地控制每个刻度标签的属性,包括使用不同的字体族、样式等。

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y, 'b-', linewidth=2)

# 设置自定义刻度位置
x_ticks = [0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi]
x_tick_labels = ['0', r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3\pi}{2}$', r'$2\pi$']

y_ticks = [-1, -0.5, 0, 0.5, 1]

# 设置刻度位置和标签
ax.set_xticks(x_ticks)
ax.set_xticklabels(x_tick_labels, 
                   fontsize=14,
                   fontfamily='times new roman',
                   fontweight='bold',
                   color='darkblue')

ax.set_yticks(y_ticks)
ax.set_yticklabels([f'{tick:.1f}' for tick in y_ticks],
                   fontsize=12,
                   fontfamily='arial',
                   color='darkred')

# 设置刻度线样式
ax.tick_params(axis='both',
               which='major',
               length=10,
               width=2,
               direction='inout')

# 添加次刻度
from matplotlib.ticker import autominorlocator
ax.xaxis.set_minor_locator(autominorlocator(2))
ax.yaxis.set_minor_locator(autominorlocator(2))
ax.tick_params(axis='both', which='minor', length=5, width=1)

ax.set_xlabel('angle (radians)', fontsize=14, fontweight='bold')
ax.set_ylabel('sin(angle)', fontsize=14, fontweight='bold')
ax.set_title('trigonometric function curve', fontsize=16, fontweight='bold')
ax.grid(true, alpha=0.3, which='both')

plt.tight_layout()
plt.show()

通过循环设置每个刻度标签

对于需要为不同刻度设置不同样式的复杂情况,可以遍历刻度标签并分别设置。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import fontproperties

fig, ax = plt.subplots(figsize=(8, 6))
x = np.arange(0, 10, 1)
y = np.random.randn(10)

ax.bar(x, y, color='skyblue', edgecolor='navy')

# 创建字体属性对象
tick_font = fontproperties(
    family='microsoft yahei',
    size=12,
    weight='bold',
    style='italic'
)

# 设置 x 轴刻度字体
for label in ax.get_xticklabels():
    label.set_fontproperties(tick_font)
    label.set_color('darkblue')
    label.set_rotation(45)
    label.set_horizontalalignment('right')

# 设置 y 轴刻度字体
for label in ax.get_yticklabels():
    label.set_fontproperties(tick_font)
    label.set_color('darkred')
    
ax.set_xlabel('category', fontsize=14, fontweight='bold')
ax.set_ylabel('value', fontsize=14, fontweight='bold')
ax.set_title('bar chart with custom tick labels', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()

全局设置刻度字体

通过 rcparams 可以全局设置所有图表的刻度字体样式,确保整个项目中的图表具有一致的外观。

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

# 使用 update 方法全局设置
matplotlib.rcparams.update({
    'xtick.labelsize': 12,      # x 轴刻度字体大小
    'ytick.labelsize': 12,      # y 轴刻度字体大小
    'xtick.color': 'blue',      # x 轴刻度颜色
    'ytick.color': 'red',       # y 轴刻度颜色
    'xtick.direction': 'in',    # x 轴刻度方向
    'ytick.direction': 'in',    # y 轴刻度方向
    'xtick.major.size': 8,      # x 轴主刻度长度
    'ytick.major.size': 8,      # y 轴主刻度长度
    'xtick.minor.size': 4,      # x 轴次刻度长度
    'ytick.minor.size': 4,      # y 轴次刻度长度
    'font.family': 'arial',     # 字体族
    'axes.unicode_minus': false
})

# 创建图表
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
x = np.linspace(0, 2*np.pi, 100)

# 绘制不同的三角函数
functions = [np.sin, np.cos, np.tan, lambda x: np.sin(x)*np.cos(x)]
titles = ['sine', 'cosine', 'tangent', 'sine × cosine']

for ax, func, title in zip(axes.flat, functions, titles):
    y = func(x)
    ax.plot(x, y, linewidth=2)
    ax.set_xlabel('x')
    ax.set_ylabel('f(x)')
    ax.set_title(title)
    ax.grid(true, alpha=0.3)
    
    # 对正切函数设置显示范围
    if title == 'tangent':
        ax.set_ylim(-5, 5)

plt.tight_layout()
plt.show()

# 重置为默认设置
matplotlib.rcparams.update(matplotlib.rcparamsdefault)

综合示例

以下是一个综合示例,展示了如何同时设置坐标轴标题字体、正确显示负号,以及自定义刻度标签。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import multiplelocator, autominorlocator

# 全局设置
plt.rcparams['font.size'] = 12
plt.rcparams['axes.unicode_minus'] = false
plt.rcparams['font.family'] = 'arial'

# 创建包含负值的数据
x = np.linspace(-10, 10, 400)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.exp(-x**2/10) * np.sin(2*x)

# 创建图形和子图
fig, axes = plt.subplots(1, 3, figsize=(18, 6))

# 第一个子图:正弦函数
axes[0].plot(x, y1, 'b-', linewidth=2)
axes[0].set_xlabel('x (radians)', fontsize=14, fontweight='bold', fontfamily='times new roman')
axes[0].set_ylabel('sin(x)', fontsize=14, fontweight='bold', fontfamily='times new roman')
axes[0].set_title('sine function: $y = \\sin(x)$', fontsize=16, fontweight='bold')

# 设置刻度
axes[0].tick_params(axis='both', which='major', labelsize=12, length=8, width=1.5)
axes[0].tick_params(axis='both', which='minor', length=4)
axes[0].xaxis.set_minor_locator(autominorlocator(2))
axes[0].yaxis.set_minor_locator(autominorlocator(2))
axes[0].grid(true, which='both', alpha=0.2, linestyle='--')

# 第二个子图:余弦函数
axes[1].plot(x, y2, 'r-', linewidth=2)
axes[1].set_xlabel('x (radians)', fontsize=14, fontweight='bold')
axes[1].set_ylabel('cos(x)', fontsize=14, fontweight='bold')
axes[1].set_title('cosine function: $y = \\cos(x)$', fontsize=16, fontweight='bold')

# 设置刻度
axes[1].tick_params(axis='both', which='major', labelsize=12, length=8, width=1.5, colors='darkred')
axes[1].tick_params(axis='both', which='minor', length=4)
axes[1].xaxis.set_minor_locator(autominorlocator(2))
axes[1].yaxis.set_minor_locator(autominorlocator(2))
axes[1].grid(true, which='both', alpha=0.2, linestyle='--')

# 第三个子图:阻尼振荡
axes[2].plot(x, y3, 'g-', linewidth=2)
axes[2].set_xlabel('time (s)', fontsize=14, fontweight='bold')
axes[2].set_ylabel('amplitude', fontsize=14, fontweight='bold')
axes[2].set_title('damped oscillation: $y = e^{-x^2/10} \\cdot \\sin(2x)$', fontsize=16, fontweight='bold')

# 设置刻度
axes[2].tick_params(axis='both', which='major', labelsize=12, length=8, width=1.5, rotation=45)
axes[2].tick_params(axis='both', which='minor', length=4)
axes[2].xaxis.set_minor_locator(autominorlocator(2))
axes[2].yaxis.set_minor_locator(autominorlocator(2))
axes[2].grid(true, which='both', alpha=0.2, linestyle='--')

plt.tight_layout()
plt.show()

结语

matplotlib 提供了丰富的接口来自定义坐标轴标题和刻度标签的字体样式。通过本文介绍的多种方法,读者可以根据具体需求选择最适合的方式来美化图表。无论是简单的字体大小调整,还是复杂的多字体混合使用,matplotlib 都能提供灵活的解决方案。正确配置坐标轴标签的字体样式不仅能提升图表的美观性,还能增强信息的传达效果,是数据可视化中不可或缺的一环。

以上就是使用matplotlib实现自定义坐标轴字体及刻度样式详解的详细内容,更多关于matplotlib自定义坐标轴字体及刻度的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com