Создание вложенных графиков на одной странице

#python

#python

Вопрос:

Как мне построить несколько вложенных графиков? так что это будет выглядеть как на картинке. изображение таково, как должны выглядеть графики, которые я могу построить индивидуально, но я не могу понять

 A = 1  # Wave amplitude in meters
T = 10  # Time Period in secs
pi = 3.14  # Value of pi
n_w = 10 # Number of waves
wavelength = 156  # Wavelength in meters


k = (2 * pi) / wavelength
w = (2 * pi) / T

def wave_elevation(x,t):
    return A * np.cos((k * x) - (w * t))

t_list = np.array([0,0.25,0.5,0.75,1.0])*T

for t in t_list:
    wave_ele_Val = []
    for i in np.linspace(0,wavelength*n_w,1560):
        wave_ele_Val.append(wave_elevation(i,t))
    fig, ax = plt.subplots(figsize=(15, 5))
    plt.plot(np.linspace(0,wavelength*n_w,1560),wave_ele_Val,'r')
    plt.title("Wave Elevation-Space Variations @ "   str(t)   "* Time Periods")
    plt.xlabel("x (m)")
    plt.ylabel("u03B7")
    plt.grid()
    plt.show()
  

Ответ №1:

Попробуйте объявить цифры вне цикла.

 import math
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

A = 1  # Wave amplitude in meters
T = 10  # Time Period in secs
pi = 3.14  # Value of pi
n_w = 10 # Number of waves
wavelength = 156  # Wavelength in meters

k = (2 * pi) / wavelength
w = (2 * pi) / T

def wave_elevation(x,t):
    return A * np.cos((k * x) - (w * t))

x_list = np.array([0,0.25,0.5,0.75,1.0])*wavelength
fig, ax = plt.subplots(len(x_list), figsize=(15, 5))
for i, x in enumerate(x_list):
    wave_ele_Val = []
    for j in np.linspace(0,T*n_w,1000):
        wave_ele_Val.append(wave_elevation(x, j))
    
    ax[i].plot(np.linspace(0,T*n_w,1000),wave_ele_Val)
    ax[i].grid()
plt.show()
  

вся конфигурация находится в ссылке

Комментарии:

1. Это не сработало. Должен ли я сначала избавиться от цикла?

2. Первый график был правильным, но остальные 4 неверны. Они сильно колеблются.

3. Ваше редактирование сработало для части a, но когда я сделал часть b, оно не сработало. Я использовал тот же код из части a, но изменил значения. Как мне выполнить часть b?

Ответ №2:

Вам нужно указать, сколько вложенных графиков вы хотите:

matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

В вашем случае это будет plt.subplots(5)

Plt.plot() необходимо изменить на ax[i].plot(x, y), где i — ваш номер подзаголовка.

Также переместите plt.show() за пределы цикла, чтобы он вызывался в конце, а не между ними.

Это один из примеров того, как вы можете это сделать:

 x_list = np.array([0,0.25,0.5,0.75,1.0])*wavelength
fig, ax = plt.subplots(5, figsize=(15, 5))

for j,x in enumerate(x_list):
    wave_ele_Val = []
    for i in np.linspace(0,T*n_w,1000):
        wave_ele_Val.append(wave_elevation(x, i))
    ax[j].plot(np.linspace(0,T*n_w,1000),wave_ele_Val)
    ax[j].grid()
    ax[j].set_title("Wave Elevation-Time Variations @ "   str(x)   "WaveLengths")
    ax[j].set_ylabel("u03B7")

fig.tight_layout()
plt.xlabel("Time (s)")
plt.show()
  

Это дает мне:

введите описание изображения здесь

Комментарии:

1. Я не мог заставить его работать. Я получил все 5 на одной странице, но строки не отображаются. Не могли бы вы рассказать немного подробнее?

2. Я добавил пример

3. Это все еще не работает. в нем говорится: TypeError: объект ‘AxesSubplot’ не подлежит подписке

4. Я немного не уверен, потому что для меня это работает просто отлично … (см. Рисунок)