matplotlib 创建单个父地物,其中Y轴表示深度

pwuypxnk  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(99)

使用下面的数据集,它表示随时间变化的深度记录的振幅。

data = {
    'Time': [0, 2.5, 5, 7.5, 10],
    'Depth_63.5': [161, 143, 134, 147, 163],
    'Depth_64.5': [183, 190, 375, 255, 241],
    'Depth_65.5': [711, 727, 914, 756, 747],
}

我可以绘制时间与振幅的曲线图,如下所示。

然而,我想要的是我在父图形上绘制的图形,X轴为时间,Y轴为深度,如下图所示。
我如何实现这个结果?我目前的代码如下所示...

import matplotlib.pyplot as plt
import pandas as pd

# Sample data..
data = {
    'Time': [0, 2.5, 5, 7.5, 10],
    'Depth_63.5': [161, 143, 134, 147, 163],
    'Depth_64.5': [183, 190, 375, 255, 241],
    'Depth_65.5': [711, 727, 914, 756, 747],
}

# Convert data to a DataFrame
df = pd.DataFrame(data)

# Extract depth levels from column names
depth_levels = [col.split('_')[1] for col in df.columns if 'Depth_' in col]

# Create the parent figure with subplots
fig, ax = plt.subplots(figsize=(10, 6))

# Loop through each depth level and plot Time vs Amplitude on the same axes
for depth_level in depth_levels:
    ax.plot(df['Time'], df[f'Depth_{depth_level}'], label=f'Depth {depth_level}')

# Customize the plot appearance
ax.set_title('Depth vs Time vs Amplitude')
ax.set_xlabel('Time (us)')
ax.set_ylabel('Depth Levels')
ax.legend()
ax.grid(True)

# Show the parent figure
plt.show()

我认为解决方案将是接近多个Y轴,但辅助Y轴将依赖于主Y轴。

kx7yvsdv

kx7yvsdv1#

看起来你正在寻找 * 次要情节 *:

(
    df.set_index("Time").iloc[:, ::-1]
        .plot(subplots=True, figsize=(8, 6), # with optional legend=False
              xlabel="Time", title="Depth vs Time vs Amplitude")
)

plt.subplots_adjust(hspace=0, top=0.94, left=0.1)
plt.gcf().supylabel("Depth")
plt.show();

输出量:

vyu0f0g1

vyu0f0g12#

我使用matplotlib 'GridSpec'模块解决了这个问题,所以确保它像这样导入:import matplotlib.gridspec as gridspec
GridSpec额外控制子图的位置,以及各个子图之间的边距和间距。它还允许我们创建可以分布在多个网格区域的轴。
我创建了一个GridSpec,其行数等于我的网格的长度,列数等于1。在该GridSpec上,我绘制了深度与时间,同时将线条样式设置为无,以防止它显示在图上(这是我想要的情节的轴,而不是情节本身).然后我添加了一个add_subplot到gridspec和plot,然后从上面的问题中绘制相应的深度级别。
最终代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

# Sample data..
data = {
    'Time': [0, 2.5, 5, 7.5, 10],
    'Depth_63.5': [161, 143, 134, 147, 163],
    'Depth_64.5': [183, 190, 375, 255, 241],
    'Depth_65.5': [711, 727, 914, 756, 747],
}

# Convert data to a DataFrame
df = pd.DataFrame(data)

# Extract depth levels from column names
depth_levels = [col.split('_')[1] for col in df.columns if 'Depth_' in col]

# Create the parent figure with subplots
fig = plt.figure(figsize=(10, 6))

# Create a grid of subplots using gridspec
gs = gridspec.GridSpec(nrows=len(depth_levels), ncols=1)

# Create an axis for the common main axis
main_ax = fig.add_subplot(gs[:, 0])
main_ax.plot(df['Time'].tolist()[:len(depth_levels)], depth_levels, linestyle='None')
main_ax.set_xlabel('Time', fontsize=15)
main_ax.set_ylabel('Depth', fontsize=15)
main_ax.axis('on')
# main_ax.grid(True)

# Loop through each depth level and plot Time vs Amplitude on the same axes
for i, depth_level in enumerate(depth_levels):
    ax = fig.add_subplot(gs[i, 0])
    ax.plot(df['Time'], df[f'Depth_{depth_level}'], label=f'Depth {depth_level}')
    ax.axis('off')
    # ax.tick_params(axis='both', direction='in', length=6, color='r', labelleft=False, labelbottom=False)

    
# Adjust spacing between subplots
# plt.tight_layout()

plt.savefig(f'001.png', dpi=300)
# Show the parent figure
plt.show()

您可以自定义轴和网格到你想要的。

相关问题