如何在matplotlib中绘制双对数图中的对角线?

eufgjt7s  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(121)

我有一个散点图,其中两个轴都是对数标度。例如,用以下代码生成的图:

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()

生成以下图Scatter plot with bisector
我想画对角线对应于10的每个幂,例如在下面的图Scatter plot with bisector and two diagonal lines
我试着加上

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

但是我得到了Scatter plot with bisector and two lines,这不是我所期望的。

1zmg4dgp

1zmg4dgp1#

将Y坐标值乘以常数

我不确定你最初的想法(0,0)和(1,1)是不是理想的。在双对数图中最好避免0。我把它改成了(1,1)和(10,10),这是同一条线。
然后你想让下一条线穿过相同的X坐标,但是Y坐标要高出10倍,所以把两个Y坐标都乘以10。
另一边的线也是如此,除以10。
在这段代码中,我做了因子k

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")

k = 10
ax.axline((1, 1),  (10, 10  ), color="black", linestyle=":")
ax.axline((1,1*k), (10, 10*k), color="black", linestyle=":")
ax.axline((1,1/k), (10, 10/k), color="black", linestyle=":")

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

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

结果为:

为什么虚线与轴相交的位置有点低?

它们实际上在正确的位置相交。它们不应该在1,10,100等处与Y轴相交。Y轴 * 不是 * 在x=1处。它是在1稍微左边的某个数字处。
如果你在x=1处画一条线,穿过x=1,你会看到虚线穿过它们的交点。

相关问题