如何填充图中不同比例的曲线之间的区域?
How to fill areas between curves with different scales in a plot?
我有一个具有三个特征的数据框:深度、渗透率和孔隙率。我想在 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]})
我已经设法将它们绘制在一起,但现在我需要用两种不同的颜色填充曲线之间的区域。例如,当 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')
所以正确的输出应该是这样的:(抱歉下面的Paint图像)
有人可以帮我解决这个问题吗?
您可以使用 fill_betweenx()
函数,但是您需要将一个轴转换为另一个轴的比例,因为您使用 twiny
。下面,我将您的 POROSITY 数据转换为适合 PERMEABILITY 轴。
然后你可以使用两个条件 fill_betweenx
,其中两条曲线比彼此大,为这些补丁分配不同的颜色。此外,由于您的数据是离散的,因此您需要在 fill_betweenx
函数中设置 interpolate=True
。
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()
结果如下(我可能使用了不同的颜色,但我认为这不是问题)。
我有一个具有三个特征的数据框:深度、渗透率和孔隙率。我想在 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]})
我已经设法将它们绘制在一起,但现在我需要用两种不同的颜色填充曲线之间的区域。例如,当 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')
所以正确的输出应该是这样的:(抱歉下面的Paint图像)
有人可以帮我解决这个问题吗?
您可以使用 fill_betweenx()
函数,但是您需要将一个轴转换为另一个轴的比例,因为您使用 twiny
。下面,我将您的 POROSITY 数据转换为适合 PERMEABILITY 轴。
然后你可以使用两个条件 fill_betweenx
,其中两条曲线比彼此大,为这些补丁分配不同的颜色。此外,由于您的数据是离散的,因此您需要在 fill_betweenx
函数中设置 interpolate=True
。
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()
结果如下(我可能使用了不同的颜色,但我认为这不是问题)。