#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. Я немного не уверен, потому что для меня это работает просто отлично … (см. Рисунок)