如何填充图中不同比例的曲线之间的区域?

use*_*026 1 plot matplotlib fill dataframe python-3.x

我有一个具有三个特征的数据框:深度、渗透性和孔隙度。我想在 y 轴上绘制 DEPTH,在 x 轴上绘制 PERMEABILITY 和 POROSITY,尽管最后两个特征具有不同的比例。

df = pd.DataFrame({'DEPTH(m)': [100, 150, 200, 250, 300, 350, 400, 450, 500, 550],
           'PERMEABILITY(mD)': [1000, 800, 900, 600, 200, 250, 400, 300, 100, 200],
           'POROSITY(%)': [0.30, 0.25, 0.15, 0.19, 0.15, 0.10, 0.15, 0.19, 0.10, 0.15]})
Run Code Online (Sandbox Code Playgroud)

我已经设法将它们绘制在一起,但现在我需要用两种不同的颜色填充曲线之间的区域。例如,当 PERMEABILITY 曲线在 POROSITY 的右侧时,它们之间的区域应该是绿色的。如果 PERMEABILITY 在左侧,则曲线之间的区域应为黄色。

f, ax1 = plt.subplots()

ax1.set_xlabel('PERMEABILITY(mD)')
ax1.set_ylabel('DEPTH(m)')
ax1.set_ylim(df['DEPTH(m)'].max(), df['DEPTH(m)'].min())

ax1.plot(df['PERMEABILITY(mD)'], df['DEPTH(m)'], color='red')
ax1.tick_params(axis='x', labelcolor='red')

ax2 = ax1.twiny()

ax2.set_xlabel('POROSITY(%)')
ax2.plot(df['POROSITY(%)'], df['DEPTH(m)'], color='blue')
ax2.tick_params(axis='x', labelcolor='blue')  
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

所以正确的输出应该是这样的:(对不起下面的 Paint 图像)

在此处输入图片说明

任何人都可以帮助我吗?

ilk*_*444 5

您可以使用该fill_betweenx()函数,但是您需要将一个轴转换为另一个轴的比例,因为您使用twiny. 下面,我将您的 POROSITY 数据转换为适合 PERMEABILITY 的轴。

然后您可以使用两个条件fill_betweenx,其中两条曲线彼此大于,为这些补丁分配不同的颜色。此外,由于您的数据是离散的,您需要interpolate=True在fill_betweenx函数中进行设置。

f, ax1 = plt.subplots()

ax1.set_xlabel('PERMEABILITY(mD)') 
ax1.set_ylabel('DEPTH(m)')
ax1.set_ylim(df['DEPTH(m)'].max(), df['DEPTH(m)'].min())

ax1.plot(df['PERMEABILITY(mD)'], df['DEPTH(m)'], color='red')
ax1.tick_params(axis='x', labelcolor='red')

ax2 = ax1.twiny()

ax2.set_xlabel('POROSITY(%)')
ax2.plot(df['POROSITY(%)'], df['DEPTH(m)'], color='blue')
ax2.tick_params(axis='x', labelcolor='blue')

# convert POROSITY axis to PERMEABILITY
# value-min / range -> normalized POROSITY (normp)
# normp*newrange + newmin -> stretched POROSITY to PERMEABILITY
z=df['POROSITY(%)']
x=df['PERMEABILITY(mD)']
nz=((z-np.min(z))/(np.max(z)-np.min(z)))*(np.max(x)-np.min(x))+np.min(x)

# fill between in green where PERMEABILITY is larger
ax1.fill_betweenx(df['DEPTH(m)'],x,nz,where=x>=nz,interpolate=True,color='g')
# fill between in yellow where POROSITY is larger
ax1.fill_betweenx(df['DEPTH(m)'],x,nz,where=x<=nz,interpolate=True,color='y')
plt.show()
Run Code Online (Sandbox Code Playgroud)

结果如下(我可能使用了不同的颜色,但我认为这不是问题)。

在此处输入图片说明