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

如何在Matplotlib双对数图中绘制对应10的幂的对角线?

双对数散点图中绘制10的幂次对角线的正确方法

问题背景

我有一个双轴均为对数刻度的散点图,初始生成代码如下:

import matplotlib.pyplot as plt
import numpy as np

rng = np.random.RandomState(42)

x = np.logspace(0, 3, 100)
y = np.logspace(0, 3, 100) + rng.randn(100) * 2

ax = plt.gca()
ax.scatter(x, y, marker="x", color="orange")

ax.axline((0, 0), (1, 1), color="black", linestyle=":")

ax.set_xscale("log")
ax.set_yscale("log")

ax.set_aspect("equal")
plt.show()

这段代码生成带平分线的散点图,我希望绘制对应每个10的幂的对角线,但尝试添加以下代码后结果不符合预期:

ax.axline((1, 0), (10, 1), color="black", linestyle=":")
ax.axline((0, 1), (1, 10), color="black", linestyle=":")

解决方案

问题出在对数刻度下,axline使用的是原始线性坐标,而非对数转换后的坐标。要绘制y = 10^n * x这类10的幂次对角线,只需利用对数轴的特性:这类直线在双对数刻度下是斜率为1的直线,只需指定轴上的有效点和斜率即可。

修改后的完整代码:

import matplotlib.pyplot as plt
import numpy as np

rng = np.random.RandomState(42)

x = np.logspace(0, 3, 100)
y = np.logspace(0, 3, 100) + rng.randn(100) * 2

ax = plt.gca()
ax.scatter(x, y, marker="x", color="orange")

# 基准对角线 y = x
ax.axline((1, 1), slope=1, color="black", linestyle=":")

# 绘制10倍和1/10倍的对角线:y=10x 和 y=x/10
ax.axline((1, 10), slope=1, color="black", linestyle=":")
ax.axline((10, 1), slope=1, color="black", linestyle=":")

# 如需更多幂次,比如y=100x、y=x/100,可继续添加:
# ax.axline((1, 100), slope=1, color="black", linestyle=":")
# ax.axline((100, 1), slope=1, color="black", linestyle=":")

ax.set_xscale("log")
ax.set_yscale("log")

ax.set_aspect("equal")
plt.show()

关键说明

  • 双对数刻度下,y = 10^n * x 取对数后变为 log₁₀(y) = log₁₀(x) + n,对应图中是斜率为1、截距为n的直线。
  • 避免使用(0,0)这类无效坐标(对数刻度下0无意义),直接选择轴上的有效点(比如(1,10)对应y=10x),再指定斜率为1就能正确绘制。
  • 之前的错误是误用了线性坐标下的点(如(1,0)),导致直线无法在对数刻度下正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:32:39