如何在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
相关产品推荐
相关产品推荐

