Как заполнить области между кривыми с разными масштабами на графике? - PullRequest
1 голос
/ 12 марта 2020

У меня есть фрейм данных с тремя функциями: Глубина, проходимость и пористость. И я хотел бы построить DEPTH на оси y, а PERMEABILITY и POROSITY вместе на оси x, хотя эти последние две функции имеют разные масштабы.

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 находится на левой стороне, область между кривыми должна быть желтой.

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')  

enter image description here

Таким образом, правильный вывод должен быть таким: ( Извините за изображение ниже)

enter image description here

Кто-нибудь может мне помочь с этим?

1 Ответ

4 голосов
/ 12 марта 2020

Вы можете использовать функцию fill_betweenx(), однако вам нужно преобразовать одну ось в масштаб другой, потому что вы используете twiny. Ниже я преобразовал ваши данные ПОРИСТОСТИ в соответствие с осью ПРОИЗВОДИТЕЛЬНОСТИ.

Тогда вы можете использовать два условных 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()

Результат такой, как показано ниже (я мог бы использовать разные цвета, но я предполагаю, что это не концерн).

enter image description here

...