2013-11-27 64 views
6

是否可以绘制两个独立的y轴,使刻度线对齐?matplotlib align twin twin刻度标记

下面是一个解决方案的一个例子。我已经使用twinx加倍了y轴,但刻度线未对齐,网格线在图上形成了一个尴尬的图案。有没有办法让刻度线共享相同的位置,但是对应于不同的y值?在下面的示例中,我希望左侧的刻度标记5与右侧的刻度标记6处于同一垂直位置。

import numpy as np 

a = np.random.normal(10, 3, size=20) 
b = np.random.normal(20, 5, size=40) 

fig, ax1 = plt.subplots() 
ax2 = ax1.twinx() 
ax1.hist(a) 
ax2.hist(b) 

histograms

此工作的总点是使网格线为两个轴重叠。

回答

9

您需要手动设置yticks,因为它们会自动计算,导致变化。添加这样的事情:

ax1.set_yticks(np.linspace(ax1.get_ybound()[0], ax1.get_ybound()[1], 5)) 
ax2.set_yticks(np.linspace(ax2.get_ybound()[0], ax2.get_ybound()[1], 5)) 

这里我们设使用的轴的边界之间5点的数组的ytick位置。既然你有一个柱状图,你可以只设置较低的值为零在每种情况下,你可能希望有上限稍大,所以我反而有

ax1.set_yticks(np.linspace(0, ax1.get_ybound()[1]+1, 5)) 
ax2.set_yticks(np.linspace(0, ax2.get_ybound()[1]+1, 5)) 

给人一种阴谋(带的变化颜色和透明度(阿尔法)为了清楚起见):`AX1:

enter image description here

+0

由于边界总是由两个数字定义(除非未定义),下面也已经限定的轴线的边界之间产生5个点。 set_yticks(np.linspace(* ax1.get_ybound(),5)'。 –