You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib双Y轴图表中设置对数刻度并显示科学计数法?

解决Matplotlib双Y轴对数刻度显示为10^n格式的问题

你需要将右侧压力轴的对数刻度从十进制小数(如0.0001)改为10^-4这类以10为底的科学计数法格式,只需修改刻度格式化器的设置即可,具体方案如下:

原代码问题点

你当前使用的ScalarFormatter()会将对数刻度转换为普通十进制数字显示,无法满足10^n的格式需求。

修改方案

替换原有的刻度格式化器为内置的数学文本格式化器,或者自定义函数生成纯文本样式的标注,两种方法任选其一:

方法一:使用内置数学文本格式化器(推荐)

该方式会生成带有上标的10^-4样式,视觉效果更专业:

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
# 假设df已正确加载

# Criar figura e eixos
fig, ax1 = plt.subplots()

# Configurar o primeiro eixo (temperatura) e todas as curvas em função desse eixo
ax1.set_xlabel('Tempo (s)')
ax1.set_ylabel('Temperaturas (ºC)')

ax1.plot(df["Tempo"], df["Temp. Forno"], color='tab:red', label='Forno')
ax1.plot(df["Tempo"], df["ViewPort"], color='tab:orange', label='ViewPort')
ax1.plot(df["Tempo"], df["Água Flange"], color='tab:olive', label='Água Flange')
ax1.plot(df["Tempo"], df["Flange Inox"], color='tab:purple', label='Flange Inox')
ax1.plot(df["Tempo"], df["Tampa"], color='tab:pink', label='Tampa')

ax1.tick_params(axis='y')

# Criar o segundo eixo (pressão)
ax2 = ax1.twinx()
ax2.set_ylabel('Pressão (mBar)')
ax2.plot(df["Tempo"], df["PressaoAlta"], color='tab:blue')
ax2.tick_params(axis='y')

# 设置对数刻度并修改格式化器
ax2.set_yscale('log')
ax2.yaxis.set_major_locator(ticker.LogLocator(subs=(1.0, 2.5, 5.0)))
# 替换为LogFormatterMathtext,生成10^n格式的刻度
ax2.yaxis.set_major_formatter(ticker.LogFormatterMathtext())

# Adicionar legenda
ax1.legend(bbox_to_anchor=(1.2, 1.1), loc='upper left')
ax2.legend(['Pressão'], bbox_to_anchor=(1.435, 0.75), loc='upper right')

# Exibir o gráfico
plt.savefig('grafico')
plt.show()

方法二:自定义纯文本格式化器

如果需要无数学上标的纯文本样式10^-4,可使用FuncFormatter自定义格式化函数:

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
# 假设df已正确加载

# 自定义格式化函数
def log_text_formatter(x, pos):
    exponent = int(np.log10(x))
    return f'10^{exponent}'

# Criar figura e eixos
fig, ax1 = plt.subplots()

# ... 温度轴配置代码与原代码一致,此处省略 ...

# 设置对数刻度并使用自定义格式化器
ax2.set_yscale('log')
ax2.yaxis.set_major_locator(ticker.LogLocator(subs=(1.0, 2.5, 5.0)))
ax2.yaxis.set_major_formatter(ticker.FuncFormatter(log_text_formatter))

# ... 图例与图表显示代码与原代码一致,此处省略 ...

关键说明

  • 方法一中的LogFormatterMathtext()会自动生成LaTeX风格的数学标注(如$10^{-4}$),在图表中显示为上标形式的10^-4。
  • 方法二中的自定义函数通过计算数值的10次幂指数,直接生成纯文本格式的10^n字符串,适配无数学格式需求的场景。

内容的提问来源于stack exchange,提问作者João Otávio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:48:10