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

