绘制数据时,垂直线被 matplotlib 错误地转换。使用线性 x 轴,我的曲线和指向曲线上特定位置的垂直线完全匹配。 在 plt.xscale('log') 之后,垂直线的终点不再在我的曲线上。
import numpy as np
import matplotlib.pyplot as plt
# Generate example data: x values from 1 to 16 (log scale)
x = np.array([1, 2, 4, 8, 16])
y = np.array([0.1, 0.2, 0.3, 0.6, 0.9])
# Perform linear interpolation to find where y crosses 0.5
crossings = np.where(np.diff(np.sign(y - 0.5)))[0]
if len(crossings) > 0:
crossing_index = crossings[0]
x1, x2 = x[crossing_index], x[crossing_index + 1]
y1, y2 = y[crossing_index], y[crossing_index + 1]
# Linear interpolation to find exact x for y = 0.5
x_nd50 = x1 + (0.5 - y1) * (x2 - x1) / (y2 - y1)
print(f"Interpolated x (ND50) = {x_nd50}")
# Plot the data with a logarithmic x scale
plt.plot(x, y, label="Data", color="blue")
# Plot the vertical line at the interpolated ND50 value
plt.plot([x_nd50, x_nd50], [0, 0.5], color='red', linestyle="--", alpha=0.7)
plt.scatter(x_nd50, 0.5, color='red', marker='x', alpha=0.7)
# First screenshot taken at this point!
# Set x-axis to log scale (log2)
plt.xscale('log')
# Second screenshot taken at this point!
# Show the plot
plt.xlabel('Log-scaled X')
plt.ylabel('Y')
plt.legend()
plt.show()
您可以使用线性插值计算 x 位置。但在对数图上,线性插值不起作用。
事实上,Matplotlib 在对数图上显示直线,但这些直线与线性图上的直线不同:如果它们相同,它们将是曲线,反之亦然。Matplotlib 只是尽力而为,没有关于点之间曲线形状的额外信息。(并且它假设您选择了对数空间,以便曲线将显示为直线,因此它默认为点之间的直线。)
因此,您需要使用对数 x 数据计算 x 位置。您可以按如下方式解决: