matplotlib绘图对数x轴范围扩至1e8后网格消失问题咨询
解决方案
你的问题由两个常见原因导致,按如下步骤修改即可:
- 首先修正
plt.grid语句里的转义字符错误:你代码里的"是HTML格式的引号转义符,Python无法识别,会导致which="both"参数不生效,网格配置失效。 - 其次手动配置对数轴的刻度定位器:当x轴范围跨度超过1e7时,matplotlib默认会自动隐藏次要对数网格避免显示过密,需要手动指定Locator强制显示所有对数刻度的网格。
- 可选优化:用
np.logspace生成对数间隔的x坐标值,比线性range生成的点在对数轴上分布更均匀,曲线更平滑,同时向量化计算y值也比循环遍历效率更高。
修正后可直接运行的完整代码
import matplotlib.pyplot as plt import numpy as np from matplotlib.ticker import LogLocator # Raw data: omega_1 = [622.0353454107791, 2043.480357454017, 4823.098705497194, 10103.361973944775, 21186.900855809567, 44151.94315355095, 86563.44397701316, 200075.46973651956, 451528.5457298466, 680657.4643267646, 1994735.4058409175, 4813736.759389496, 7052058.693219152] # in rad/sec Phase_1_in_Rad_flipped = [1.548107046524, 1.569050997548, 1.565560339044, 1.567305668296, 1.541125729516, 1.40499004786, 1.23045712266, 0.97738438112, 0.577703982412, 0.380481776936, 0.1514945790736, 0.019198621772, -0.042411500823600005] # 用logspace生成对数间隔的x值,范围从1到1e8,共1000个点,分布更均匀 omega_value_list = np.logspace(0, 8, 1000) # 直接向量化计算y值,不需要循环,效率更高 y_values_Phasenverschiebung = np.arctan(1/(omega_value_list * 75 * 0.0000000045)) plt.plot(omega_1, Phase_1_in_Rad_flipped, marker='o', label='Verbundene, gemessenen Punkte') plt.plot(omega_value_list, y_values_Phasenverschiebung, label='Theoretische Erwartungen') plt.xscale('log') plt.ylabel('Phasenverschiebung [rad]') plt.xlabel('Kreisfrequentz [rad/s]') # 手动配置x轴对数刻度定位器,强制显示主次网格 ax = plt.gca() ax.xaxis.set_major_locator(LogLocator(base=10.0, numticks=15)) ax.xaxis.set_minor_locator(LogLocator(base=10.0, subs=np.arange(2, 10)*0.1, numticks=15)) plt.grid(True, which="both") plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

