في هذا المقال سوف نستعرض كيفية تنفيذ التصوير ثلاثي الأبعاد للبيانات والدوال بإستخدام لغة البرمجة بايثون. في البداية سوف نقوم بتثبيت وتفعيل بعض الحزم المطلوبة وهي:
In:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
الآن سوف نستعرض بعض طرق التصوير ثلاثي الأبعاد للبيانات والدوال كما يلي:
اولاً: الأعمدة البيانية ثلاثية الأبعاد
ويمكن الحصول على ذلك من خلال الكود التالي:
In:
import numpy as np
import random
fig = plt.figure(figsize=(10,10))
ax = plt.axes(projection="3d")
x = np.random.randint(1,10,7)
y = np.random.randint(1,10,7)
z = np.zeros(7)
dx = np.ones(7)
dy = np.ones(7)
dz = np.random.randint(1,10,7)
ax.bar3d(x, y, z, dx, dy, dz)
ax.set_xlabel('x',)
ax.set_ylabel('y')
ax.set_zlabel('z');
plt.show()
والذي يعطي الشكل التالي:
ملاحظة: z, y ,x تمثل إحداثيات نقطة ربط الأعمدة البيانية و dz, dy, dx تمثل عرض الأعمدة وعمقها وارتفاعها على التوالي.
ثانياً: التصوير ثلاثي الأبعاد للدوال
للتصوير ثلاثي الأبعاد للدوال نتبع الخطوات التالية:
1. تعريف الدالة، مثلاً:
In:
def f(x, y):
return x*y
2. تحديد البيانات او القيم التي سوف يتم تصوير الدالة عندها، مثلاً:
In:
x = np.linspace(-5, 5, 30)
y = np.linspace(-5, 5, 30)
x, y = np.meshgrid(x, y)
z = f(x, y)
3. تصوير الدالة باستخدام الكود التالي:
In:
fig = plt.figure(figsize=(10,10))
ax = plt.axes(projection='3d')
ax.plot_surface(x, y, z, rstride=1, cstride=1,
cmap='viridis', edgecolor='none')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
والذي يعطي الشكل التالي:
مثلاً، باستخدام الطريقة اعلاه يمكن تصوير التوزيع الطبيعي متعدد المتغيرات ( multivariate Gaussian distribution) باستخدام الكود التالي:
In:
from scipy.stats import multivariate_normal
mu = [0, 0]
covariance = [[1, 0], [0, 1]]
x = np.linspace(-3,3,100)
y = np.linspace(-3,3,100)
x, y = np.meshgrid(x,y)
xy = np.empty((100,100,2))
xy[:, :, 0] = x; xy[:, :, 1] = y
mvn = multivariate_normal(mu, covariance)
z=mvn.pdf(xy)
fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')
ax.plot_surface(x, y,z,cmap='viridis',linewidth=0)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
والذي يعطي الشكل التالي: