在matplotlib中将两个y轴对齐

时间:2015-01-08 20:34:26

标签: python matplotlib plot

我正在绘制一些硬度数据,我想显示两种不同的硬度标度。一个刻度没有限制,而另一个刻度没有。在维氏硬度标度中,没有限制,但罗克韦尔C标度在20以下无效。如何使标尺对齐?到目前为止,我的计划是绘制维克斯数据,然后对其进行过滤,以便在那里没有20以下(测试机器的报告将其指定为0)。然后我绘制了罗克韦尔数据,但是要隐藏点并将其分配给第二个y轴。我没有绘制问题,但我不能让两个轴'排列正确。我可以强迫它们在一个点上排成一行,但是缩放是关闭的,所以它们开始从我排列的位置开始分开。

我从另一个问题中找到的代码是:

def align_yaxis(ax1, v1, ax2, v2):
"""adjust ax2 ylimit so that v2 in ax2 is aligned to v1 in ax1"""
_, y1 = ax1.transData.transform((0, v1))
_, y2 = ax2.transData.transform((0, v2))
inv = ax2.transData.inverted()
_, dy = inv.transform((0, 0)) - inv.transform((0, y1-y2))
miny, maxy = ax2.get_ylim()
ax2.set_ylim(miny+dy, maxy+dy)

我无法上传图片,但这里是一个示例图的链接。 Plot

我所做的是将维克斯392与HRC 40对齐。但在底部,HRC 20不等于200,它应该等于238.在这个例子中,我将HRC标记打开为x的

编辑:这是我用来生成图表但使用硬编码数据集的代码。

xData = [[-0.00107, 0.014, 0.0299, 0.044, 0.0584, 0.0744, 0.089, 0.104, 0.119, 0.135, 0.149,   0.164, 0.179, 0.194, 0.208, 0.224, 0.239, 0.254, 0.269, 0.284, 0.299, 0.314, 0.329, 0.344, 0.359, 0.372, 0.389, 0.404, 0.419, 0.434, 0.449, 0.464, 0.479, 0.494, 0.509, 0.524, 0.539, 0.554, 0.569, 0.584, 0.599, 0.614, 0.629, 0.644, 0.659, 0.674, 0.689, 0.704, 0.719, 0.734, 0.749, 0.764, 0.779, 0.794, 0.809, 0.824, 0.839]]

yData = [[244.0, 225.0, 203.0, 209.0, 214.0, 220.0, 215.0, 220.0, 217.0, 218.0, 220.0, 220.0, 215.0, 221.0, 213.0, 216.0, 221.0, 222.0, 220.0, 216.0, 223.0, 219.0, 216.0, 308.0, 327.0, 338.0, 347.0, 334.0, 314.0, 383.0, 360.0, 323.0, 306.0, 213.0, 223.0, 223.0, 222.0, 217.0, 215.0, 219.0, 214.0, 221.0, 217.0, 214.0, 217.0, 214.0, 219.0, 211.0, 218.0, 213.0, 216.0, 218.0, 213.0, 222.0, 214.0, 227.0, 251.0]]

hrcX = [[-0.00107, 0.344, 0.359, 0.372, 0.389, 0.404, 0.419, 0.434, 0.449, 0.464, 0.479, 0.839]]

hrcY = [[21.2, 30.7, 33.0, 34.2, 35.3, 33.8, 31.5, 39.1, 36.6, 32.6, 30.5, 22.5]]

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(xData[t],yData[t], '--o')
ax2.plot(hrcX[t], hrcY[t], 'x')
ax1.set_ylabel('Vickers Hardness')
ax1.set_xlabel('Distance (in)')
ax2.set_ylabel('HRC')
align_yaxis(ax1,392,ax2,40)
plt.show()

2 个答案:

答案 0 :(得分:2)

您可以手动设置限制,然后确保第二个y轴上没有低于20的刻度:

ax1.set_ylim([200, 392])
ax2.set_ylim([20*200/238.,40])
ax2.set_yticks([20, 25, 30, 35, 40])

答案 1 :(得分:0)

因此,为了解决我的问题,我在适当的y值处使用axhlines并用文本标记它们。所以我基本上只是制作了自己的比例,并没有让matplotlib为我做到这一点。