2015-01-08 69 views
2

我正在绘制一些硬度数据,并且我想要显示两个不同的硬度标尺。一个量表没有限制,而另一个没有限制。在维氏硬度标尺中,没有限制,但洛氏C标尺在20以下无效。我怎样才能使标尺一致?到目前为止,我的计划是绘制维克斯数据,然后对其进行过滤,使其中没有低于20的数据(来自测试机器的报告将其指定为0)。然后我绘制了罗克韦尔的数据,但是要隐藏这些点并将其分配给第二个y轴。我没有任何问题阴谋,但我不能让两个轴'排列正确。我可以强迫他们在某一点排队,但缩放已关闭,所以他们开始从我排队的地方开始分开。在matplotlib中创建两个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) 

我不能上传图片还没有,但这里是一个示例图的链接。​​

我所做的就是排队维克斯392热轧卷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() 
+0

这里的主要问题似乎是两个尺度(维克斯和洛克韦尔)之间的转换不是线性的,对吗? ([来源](http://en.wikipedia.org/wiki/Hardness_comparison)) – hitzg

回答

2

你可以只手动设定的极限,然后确保你有低于20没有蜱第二Y轴:

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

如果我这样做了,那么在维氏等级中没有显示238以下的数据。 – NoobLord

+0

啊,现在我明白了。我将编辑我的解决方案 – hitzg

+1

我不会使用'set_yticks',因为它会将值从标签中分离出来。 – tacaswell

0

所以,要解决我的问题,我用axhlines在适当的y值并用文本标记。所以我基本上只是做了我自己的规模,并没有让matplotlib为我做。