Трехмерные графики плотности вероятности в Python

Я работаю над набором данных, состоящим из значений «длины импульса» и 5 или 6 «значений напряжения», соответствующих каждой из длин импульсов. Первое значение — это длина импульса, за которым следуют напряжения. Найдите таблицу ниже.

15 -56V -47V -53V -50V -50V


16 -49V -46V -52V -47V -50V


17 -50V -51V -47V -50V -49V


18 -50V -51V -48V -48V -45V


19 -49V -51V -45V -47V -52V


20 -45V -47V -50V -47V -54V


21 -46V -52V -52V -49V -54V


22 -53V -51V -53V -56V -52V


23 -52V -45V -51V -56V -53V


24 -51V -52V -54V -58V -52V


25 -56V -53V -57V -55V -53V


26 -53V -52V -55V -52V


27 -54V -49V -56V -54V


28 -52V -52V -57V -56V -53V


29 -63V -60V -54V -58V -61V


30 -59V -70V -61V


Я хочу, чтобы оси X и Y были длиной импульса и напряжением, и я хочу, чтобы ось Z была его распределением вероятностей. У меня есть 2D-график для того же, используя набор «значений напряжения» и его вероятность. введите описание изображения здесь На рисунке красный график соответствует одной длине импульса, а зеленый график соответствует другой длине импульса. Я попытался построить трехмерный график таким же образом, используя пример многомерного нормального распределения из переполнения стека (Plot нормальное распределение в 3D). Поскольку у меня очень мало опыта работы с 3D-графиками, я не могу построить несколько поверхностных графиков на одной и той же поверхности с разными значениями «длины импульса» по оси Y. Код, который я пробовал, приведен ниже.

 import numpy as np
 import matplotlib
 import matplotlib.pyplot as plt
 from matplotlib.mlab import bivariate_normal
 from mpl_toolkits.mplot3d import Axes3D

 #Parameters to set
 mu_x = -48.8
 sigma_x = np.sqrt(6.5)

 mu_y = 0
 sigma_y = np.sqrt(16)

 #Create grid and multivariate normal
 x = range(-100,0)
 y = range(15,30)
 X, Y = np.meshgrid(x,y)
 Z = bivariate_normal(X,Y,sigma_x,sigma_y,mu_x,mu_y)


 #Make a 3D plot
 fig = plt.figure()
 ax = fig.gca(projection='3d')
 ax.plot_surface(X, Y, Z,cmap='Reds',linewidth=0, antialiased=True, 
 zorder = 0.5)

 ax.set_xlabel('Voltage')
 ax.set_ylabel('Pulse Length')
 ax.set_zlabel('Normal Distribution')
 plt.show()

Я был бы очень благодарен, если бы кто-нибудь помог мне сделать то же самое для нескольких длин импульсов. Спасибо.


person Vishvachi Sinha    schedule 09.09.2018    source источник


Ответы (1)


Я не знаю, какой именно сюжет вы хотите получить, но, насколько я понял, вам нужно что-то вроде рисунка ниже. Ниже я помещаю только соответствующий/модифицированный код. Также не ясно, какой переменной является ваша длина импульса. Поскольку у вас много длин импульсов, вы можете поместить функцию для определения mu_x, 'mu_y', Z в цикл for и построить несколько трехмерных поверхностей.

# Create grid and multivariate normal
x = np.linspace(-100, 0, 200) # Create a mesh of 200 x-points
y = np.linspace(-30, 30, 200) # Create a mesh of 200 y-points

X, Y = np.meshgrid(x,y)
Z = bivariate_normal(X,Y,sigma_x,sigma_y,mu_x,mu_y)
Z2 = bivariate_normal(X,Y,sigma_x,sigma_y,mu_x-20,mu_y+10)

fig = plt.figure(figsize=(10, 8))
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z,cmap='Reds',linewidth=0, antialiased=True, zorder = 0.5)
ax.plot_surface(X, Y, Z2,cmap='Blues',linewidth=0, alpha=0.5, antialiased=True, zorder = 0.5)

Вывод

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

person Sheldore    schedule 10.09.2018