You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Matplotlib symlog刻度负号缺失:如何修复负坐标轴标签?

修复Symlog刻度下负y轴标签缺失负号的问题

你使用symlog对称对数刻度绘制图表时,负y轴标签丢失了负号,当前代码如下:

from matplotlib import pyplot as plt
from matplotlib import ticker
(_, ax) = plt.subplots()
ax.plot([-100, -1, -0.5, 0, 0.5, 1, 100], marker='o')
ax.set_yscale('symlog', linthresh=1)
ax.yaxis.set_major_formatter(ticker.LogFormatter(linthresh=1))

问题原因

ticker.LogFormatter是为普通单方向对数刻度设计的,它会忽略数值的符号,因此在symlog的负半轴无法正确显示负号。

解决方案

方法1:使用专门的SymLogFormatter

Matplotlib提供了SymLogFormatter,专门适配symlog刻度,能自动处理正负号:

from matplotlib import pyplot as plt
from matplotlib import ticker

(_, ax) = plt.subplots()
ax.plot([-100, -1, -0.5, 0, 0.5, 1, 100], marker='o')
ax.set_yscale('symlog', linthresh=1)
# 替换为SymLogFormatter,匹配linthresh和对数底数
ax.yaxis.set_major_formatter(ticker.SymLogFormatter(linthresh=1, base=10))
plt.show()

该格式化器会自动识别正负半轴的数值,添加对应符号,同时保持非科学计数法显示。

方法2:自定义格式化函数

如果需要更灵活的格式控制,可以编写自定义格式化函数:

from matplotlib import pyplot as plt
from matplotlib import ticker

(_, ax) = plt.subplots()
ax.plot([-100, -1, -0.5, 0, 0.5, 1, 100], marker='o')
ax.set_yscale('symlog', linthresh=1)

def custom_symlog_label(x, pos):
    if x == 0:
        return '0'
    # 添加负号(如果是负数)
    sign = '-' if x < 0 else ''
    abs_val = abs(x)
    # 对大于等于1的数值用整数显示,小于1的保留小数
    return f"{sign}{int(abs_val) if abs_val >=1 else abs_val}"

ax.yaxis.set_major_formatter(ticker.FuncFormatter(custom_symlog_label))
plt.show()

这个函数可以根据需求调整显示格式,确保负号正常显示的同时,保持你需要的非科学计数法样式。

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

火山引擎 最新活动