Заполнение области между графиками после установки пределов оси X - PullRequest
1 голос
/ 09 мая 2020

Мне трудно установить пределы оси X c, когда я строю две кривые на одном графике.

Мои данные имеют две кривые (ПРОНИЦАЕМОСТЬ и ПОРИСТОСТЬ), а ГЛУБИНА будет работать как индекс . Так что мне удалось изобразить их на одном графике и с некоторой помощью заполнить области между ними. Вот мой код:

df = pd.DataFrame({'DEPTH': [100, 150, 200, 250, 300, 350, 400, 450, 500, 550],
       'PERMEABILITY': [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]})

f, ax1 = plt.subplots()

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

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

ax2 = ax1.twiny()

ax2.set_xlabel('POROSITY')
ax2.plot(df['POROSITY'], df['DEPTH'], 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']
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'],x,nz,where=x>=nz,interpolate=True,color='g')
# fill between in yellow where POROSITY is larger
ax1.fill_betweenx(df['DEPTH'],x,nz,where=x<=nz,interpolate=True,color='y')
plt.show()

enter image description here

Но когда я пытаюсь установить определенные c пределы для оси X, эта заполненная область не следует новый «размер кривой», как вы видите на левом изображении ниже. Мой результат должен быть похож на изображение справа (я сделал это в Paint). Например, если я добавлю:

ax1.set_xlim(0, 1500)
ax2.set_xlim(-0.10, 0.45)

enter image description here

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

1 Ответ

1 голос
/ 09 мая 2020

Ваше вычисление nz преобразуется между двумя масштабами оси x. Когда вы меняете две шкалы на разные величины, вам нужно изменить расчет nz. Вам нужно будет решить, как это сделать точно, но здесь я просто оценил наклон и смещение, пока они не совпадают.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame({'DEPTH': [100, 150, 200, 250, 300, 350, 400, 450, 500, 550],
       'PERMEABILITY': [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]})

f, ax1 = plt.subplots()

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

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

ax2 = ax1.twiny()

ax2.set_xlabel('POROSITY')
ax2.plot(df['POROSITY'], df['DEPTH'], 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']
nz=((z-np.min(z))/(np.max(z)-np.min(z)))*(np.max(x)-np.min(x))*0.6+np.min(x)+450
#                                                          slope ^      offset ^

ax1.set_xlim(0, 1500)
ax2.set_xlim(-0.10, 0.45)
# fill between in green where PERMEABILITY is larger
ax1.fill_betweenx(df['DEPTH'],x,nz,where=x>=nz,interpolate=True,color='g')
# fill between in yellow where POROSITY is larger
ax1.fill_betweenx(df['DEPTH'],x,nz,where=x<=nz,interpolate=True,color='y')
plt.show()

Кроме того, на ваш вопрос легче ответить, если вы включите весь необходимый импорт во фрагменте кода.

...