python-3.x - 设置 X 轴限制后填充绘图之间的区域
问题描述
当我在同一张图上绘制两条曲线时,我很难设置 X 轴的特定限制。
我的数据有两条曲线(渗透率和孔隙率),深度将像索引一样工作。所以我设法将它们绘制在同一张图上,并在一些帮助下填充它们之间的区域。这是我的代码:
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()
但是,当我尝试为 X 轴设置特定限制时,该填充区域不遵循新的“曲线大小”,如下左图所示。我的结果应该像右边的图像(我在 Paint 上做了这个)。例如,如果我添加:
ax1.set_xlim(0, 1500)
ax2.set_xlim(-0.10, 0.45)
有人可以帮我解决这个问题吗?提前致谢!
解决方案
您计算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()
此外,如果您在代码片段中包含所有必要的导入,则更容易回答您的问题。
推荐阅读
- javascript - 如果在 datepicker 上未选择日期以及如何关闭 onblur,则字段值将更改为未定义
- hyperledger-fabric - 在超级账本结构中调用链码时出错
- python - 在这种情况下,如何跳出 python while 循环?
- anaconda - 如何在 Pycharm 中使用 root anaconda 环境
- vue.js - vue引导页面大小问题
- java - DatePickerDialog 打开两次
- python - 在鼻子测试类中定义鼻子测试方法
- node.js - 如何解决错误:TypeError:app.listen 不是函数
- python - 如何使用字符串作为变量名?
- php - 无法将值从表单传递到要发布的变量