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

Symlog刻度下自定义Y轴主刻度异常:SymmetricalLogLocator参数疑问

问题

在Python中使用Seaborn和Matplotlib绘制箱线图,将Y轴设置为对称对数(symlog)刻度,尝试通过自定义SymmetricalLogLocator指定特定间隔的主刻度,但结果不符合预期。期望生成间隔为两个数量级的主刻度(如1、100、10000等),但实际图表显示每个数量级都有刻度(1、10、100等)。

最小可复现代码:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt 
from matplotlib import ticker 

url = 'https://public.tableau.com/app/sample-data/titanic%20passenger%20list.csv'
titanic = pd.read_csv(url)

ax = sns.boxplot(x=titanic["age"].round(-1), y=titanic["fare"], native_scale=True)

ax.set_yscale('symlog', linthresh=1)
ax.set_ylim(bottom=-1, top=10**8)  # Extending the y-axis upper limit

# Attempting to set major ticks at specific intervals
subs = [10**i for i in range(0, 8, 2)]
ax.yaxis.set_major_locator(ticker.SymmetricalLogLocator(base=10.0, linthresh=1, subs=subs))

plt.show()

原因与解决方法

你对SymmetricalLogLocator的subs参数理解有误:

  • subs参数并非直接指定要显示的刻度值,而是定义每个数量级内要显示的子刻度(相对于基数的比例)。比如基数为10时,默认subs=[1.0]表示每个数量级只显示1倍基数的刻度(1、10、100...);如果subs=[1.0, 3.0],则每个数量级会显示1和3倍基数的刻度(1、3、10、30...)。
  • 你传入的[1, 100, 10000...]是具体的刻度值,这不符合subs的参数逻辑,Matplotlib无法识别,所以会 fallback 到默认行为。

要实现间隔两个数量级的主刻度,正确做法是直接手动指定主刻度位置,配合FixedLocator设置自定义刻度点:

修改后的代码:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt 
from matplotlib import ticker 

url = 'https://public.tableau.com/app/sample-data/titanic%20passenger%20list.csv'
titanic = pd.read_csv(url)

ax = sns.boxplot(x=titanic["age"].round(-1), y=titanic["fare"], native_scale=True)

ax.set_yscale('symlog', linthresh=1)
ax.set_ylim(bottom=-1, top=10**8)

# 直接指定要显示的主刻度位置
major_ticks = [10**i for i in range(0, 8, 2)]
# 若需要负刻度可添加对应负值,此处fare无负值故省略
ax.yaxis.set_major_locator(ticker.FixedLocator(major_ticks))
# 可选:设置刻度标签格式,避免科学计数法
ax.yaxis.set_major_formatter(ticker.StrMethodFormatter("{x:.0f}"))

plt.show()

如果需要保留线性区间(linthresh范围内)的刻度,可将线性区间的刻度加入major_ticks列表,例如major_ticks = [-1, 0, 1, 100, 10000, 1000000, 100000000],按需调整即可。


内容的提问来源于stack exchange,提问作者ex1led

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:18:22