Skip to main content
 首页 » 编程设计

python之matplotlib之第二个 X 轴有一个偏移量(wrt 第一个 X 轴)我无法确定

2025年05月04日9soundcode

继我的问题之后:Force the Y axis to only use integers以及我在那里得到的大力帮助我在绘制漂亮的图表时遇到了另一个问题。

我正在使用 pyplot 模块在图表顶部绘制带有一些引用点的第二轴,但我似乎无法让底部和顶部 x 轴就据称相同的位置达成一致。 ..

如果您查看图表,您会看到 1 Kb 的标记(虚线)和相同的第二轴标记不一致。与 1 Mb 相同,但 1Gb 似乎是一致的。

第二个轴来自一个重叠的子图(据我所知)从这里开始:

fig = plt.figure() 
ax1 = fig.add_subplot(111) 

我对两个轴使用相同的约束:

 ax1.set_xscale("log", basex=2) 
 ax1.set_xlim(0,34359738368)   

和:

ax2 = ax1.twiny() 
ax2.set_xlim(0,34359738368) 
ax2.set_xscale("log", basex=2) 

并且两组标记的值相同:

ax1.axvline(x=1024, color='black', linestyle='--') 
ax1.axvline(x=1048576, color='black', linestyle='--') 
ax1.axvline(x=1073741824, color='black', linestyle='--') 

和:

ax2.set_xticks([1024, 1048576, 1073741824]) 
ax2.set_xticklabels(['1 Kbyte','1 Mbyte','1 Gbyte'], fontsize=8) 

知道他们为什么不排队吗?我确定我一路上做了一些愚蠢的事情..

请您参考如下方法:

当我准确运行您发布的代码片段时,我得到一个图表,显示您所看到的分歧,但也不同意 x 限制是什么:

In [68]: ax1.get_xlim() 
Out[68]: (9.9999999999999995e-08, 34359738368.0) 
 
In [69]: ax2.get_xlim() 
Out[69]: (0.0, 34359738368.0) 

这(显然)是因为您以不同的顺序为不同的轴调用了 set_xscale() 和 set_xlim(),并且 log(0) 给出 -inf。如果您将 0 作为边界,然后设置 log 轴,它显然会尝试从中恢复,但反之则不然。

如果您使用了 0 但使用了相同的顺序:

In [103]: ax1.get_xlim() 
Out[103]: (0.0, 34359738368.0) 
 
In [104]: ax2.get_xlim() 
Out[104]: (0.0, 34359738368.0) 

或者如果您改用 1 的下限,您会看到:

In [88]: ax1.get_xlim() 
Out[88]: (1.0, 34359738368.0) 
 
In [89]: ax2.get_xlim() 
Out[89]: (1.0, 34359738368.0) 

我自己会使用第二种方法:更明确,并且不会引入顺序依赖性。