如何使用matplotlib.pyplot绘制fill_betweenx以不同比例填充y1和y2之间的区域?

时间:2019-09-03 06:57:13

标签: python-3.x matplotlib

我正在尝试使用matplotlib.pyplot填充两条垂直曲线(RHOB和NPHI)之间的区域。 RHOB和NPHI的x轴比例都不同。

但是当我尝试绘制时,我注意到fill_between正在以相同比例填充RHOB和NPHI之间的区域。

#well_data is the data frame i am reading to get my data

#creating my subplot
fig, ax=plt.subplots(1,2,figsize=(8,6),sharey=True)
ax[0].get_xaxis().set_visible(False)
ax[0].invert_yaxis()

#subplot 1:
#ax01 to house the NPHI curve (NPHI curve are having values between 0-45)
ax01=ax[0].twiny()
ax01.set_xlim(-15,45)
ax01.invert_xaxis()
ax01.set_xlabel('NPHI',color='blue')
ax01.spines['top'].set_position(('outward',0))
ax01.tick_params(axis='x',colors='blue')
ax01.plot(well_data.NPHI,well_data.index,color='blue')

#ax02 to house the RHOB curve (RHOB curve having values between 1.95,2.95)
ax02=ax[0].twiny()
ax02.set_xlim(1.95,2.95)
ax02.set_xlabel('RHOB',color='red')
ax02.spines['top'].set_position(('outward',40))
ax02.tick_params(axis='x',colors='red')
ax02.plot(well_data.RHOB,well_data.index,color='red')


# ax03=ax[0].twiny()
# ax03.set_xlim(0,50)
# ax03.spines['top'].set_position(('outward',80))
# ax03.fill_betweenx(well_data.index,well_data.RHOB,well_data.NPHI,alpha=0.5)
plt.show() 
ax03=ax[0].twiny()
ax03.set_xlim(0,50)
ax03.spines['top'].set_position(('outward',80))
ax03.fill_betweenx(well_data.index,well_data.RHOB,well_data.NPHI,alpha=0.5)

上面是我尝试过的代码,但是最终结果不是我期望的。 假设RHOB和NPHI的比例相同,它就是RHOB和NPHI之间的填充区域。

image1

如何填充蓝色和红色曲线之间的区域?

image2

1 个答案:

答案 0 :(得分:0)

由于数据位于两个不同的轴上,但是每个艺术家都需要单独位于一个轴上,所以这很难。这里需要做的是在单个单位系统中计算所有数据。您可能会选择先将两个数据集转换为显示空间(即像素),然后通过fill_betweenx绘制这些转换后的数据,而无需再次转换(transform=None)。

import numpy as np
import matplotlib.pyplot as plt


y = np.linspace(0, 22, 101)
x1 = np.sin(y)/2
x2 = np.cos(y/2)+20

fig, ax1 = plt.subplots()
ax2 = ax1.twiny()
ax1.tick_params(axis="x", colors="C0", labelcolor="C0")
ax2.tick_params(axis="x", colors="C1", labelcolor="C1")

ax1.set_xlim(-1,3)
ax2.set_xlim(15,22)

ax1.plot(x1,y, color="C0")
ax2.plot(x2,y, color="C1")

x1p, yp = ax1.transData.transform(np.c_[x1,y]).T
x2p, _ = ax2.transData.transform(np.c_[x2,y]).T
ax1.autoscale(False)
ax1.fill_betweenx(yp, x1p, x2p, color="C9", alpha=0.4, transform=None)

plt.show()

我们同样可以选择将数据从第二个轴转换为第一个轴。这样做的好处是,它没有在像素空间中定义,因此可以避免在创建图形后更改图形大小时发生的问题。

x2p, _ = (ax2.transData + ax1.transData.inverted()).transform(np.c_[x2,y]).T
ax1.autoscale(False)
ax1.fill_betweenx(y, x1, x2p, color="grey", alpha=0.4)

enter image description here