对数刻度不是从列中的值开始

Log-scale not starting from the value in the column

我正在绘制一系列频率,值从 800 开始到 10k。 在使用下面的代码时,我很困惑为什么对数刻度从 x 轴上的 1 开始。它需要从 10^3 开始。

fig, ax = plt.subplots(figsize=(10, 8))

g = sns.pointplot(data=combined_data, x="freq", y="signal", linestyles=["-"], color="hotpink", markers=["s"])
g.set(xscale='log')
g.set(yscale='log')
plt.axvline(20, linestyle='--', color='steelblue')
plt.xlabel("Frequency [Hz] ---> ")
plt.ylabel("Signal [mV] ---> ")

为什么会这样?

您需要创建一个 sns.lineplotsns.pointplot 使 x 轴分类,因此内部编号 0,1,2,... 也适用于数字数据。当 x 轴尚未设置为对数刻度时,这更容易看到。

下面的代码说明了区别:

from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(16, 5))

x = np.logspace(1, 4, 40)
y=1000 - np.sqrt(x)
sns.pointplot(x=x, y=y, linestyles=["-"], color="hotpink", markers=["s"], ax=ax1)
ax1.set(xscale='log', yscale='log')
ax1.axvline(20, linestyle='--', color='steelblue')
ax1.set_title('sns.pointplot()')

sns.lineplot(x=x, y=y, color="hotpink", marker="s", markersize=10, ax=ax2)
ax2.set(xscale='log', yscale='log')
ax2.set_title('sns.lineplot()')

for ax in (ax1, ax2):
    ax.axvline(20, linestyle='--', color='steelblue')
    ax.set_xlabel("Frequency [Hz] ---> ")
    ax.set_ylabel("Signal [mV] ---> ")

plt.tight_layout()
plt.show()