matplotlib
तीन आयामी भूखंड
खोज…
टिप्पणियों
Matplotlib में त्रि-आयामी साजिश ऐतिहासिक रूप से एक कीचड़ का एक सा रहा है, क्योंकि प्रतिपादन इंजन स्वाभाविक रूप से 2d है। तथ्य यह है कि 3 डी setups एक 2d chunk की साजिश रचने के बाद प्रदान किए जाते हैं दूसरे का मतलब है कि अक्सर वस्तुओं की स्पष्ट गहराई से संबंधित मुद्दों का प्रतिपादन कर रहे हैं। समस्या का मूल यह है कि दो गैर-कनेक्टेड ऑब्जेक्ट या तो पूरी तरह से पीछे हो सकते हैं, या पूरी तरह से एक दूसरे के सामने हो सकते हैं, जो कलाकृतियों की ओर जाता है जैसा कि दो इंटरलॉक्ड रिंग्स के नीचे के चित्र में दिखाया गया है (एनिमेटेड जिफ के लिए क्लिक करें):
हालांकि यह तय किया जा सकता है। एक ही प्लॉट पर कई सतहों की साजिश रचने के दौरान यह गुण मौजूद होता है - जैसा कि प्रत्येक एक फ्लैट 2 डी आकार के रूप में प्रदान किया जाता है, जिसमें एक एकल पैरामीटर दृश्य दूरी का निर्धारण करता है। आप देखेंगे कि एक एकल जटिल सतह एक ही समस्या का सामना नहीं करती है।
यह उपाय करने के लिए पारदर्शी पुलों का उपयोग करके एक साथ भूखंड वस्तुओं में शामिल होना है:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from scipy.special import erf
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(0, 6, 0.25)
Y = np.arange(0, 6, 0.25)
X, Y = np.meshgrid(X, Y)
Z1 = np.empty_like(X)
Z2 = np.empty_like(X)
C1 = np.empty_like(X, dtype=object)
C2 = np.empty_like(X, dtype=object)
for i in range(len(X)):
for j in range(len(X[0])):
z1 = 0.5*(erf((X[i,j]+Y[i,j]-4.5)*0.5)+1)
z2 = 0.5*(erf((-X[i,j]-Y[i,j]+4.5)*0.5)+1)
Z1[i,j] = z1
Z2[i,j] = z2
# If you want to grab a colour from a matplotlib cmap function,
# you need to give it a number between 0 and 1. z1 and z2 are
# already in this range, so it just works as is.
C1[i,j] = plt.get_cmap("Oranges")(z1)
C2[i,j] = plt.get_cmap("Blues")(z2)
# Create a transparent bridge region
X_bridge = np.vstack([X[-1,:],X[-1,:]])
Y_bridge = np.vstack([Y[-1,:],Y[-1,:]])
Z_bridge = np.vstack([Z1[-1,:],Z2[-1,:]])
color_bridge = np.empty_like(Z_bridge, dtype=object)
color_bridge.fill((1,1,1,0)) # RGBA colour, onlt the last component matters - it represents the alpha / opacity.
# Join the two surfaces flipping one of them (using also the bridge)
X_full = np.vstack([X, X_bridge, np.flipud(X)])
Y_full = np.vstack([Y, Y_bridge, np.flipud(Y)])
Z_full = np.vstack([Z1, Z_bridge, np.flipud(Z2)])
color_full = np.vstack([C1, color_bridge, np.flipud(C2)])
surf_full = ax.plot_surface(X_full, Y_full, Z_full, rstride=1, cstride=1,
facecolors=color_full, linewidth=0,
antialiased=False)
plt.show()
त्रि-आयामी कुल्हाड़ियों का निर्माण
Matplotlib कुल्हाड़ियों डिफ़ॉल्ट रूप से दो आयामी हैं। तीन-आयामी भूखंड बनाने के लिए, हमें mplot3d टूलकिट से Axes3D
वर्ग को आयात करने की आवश्यकता है, जो कि कुल्हाड़ियों के लिए एक नए प्रकार के प्रक्षेपण को सक्षम करेगा, जिसका नाम '3d'
:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
द्वि-आयामी भूखंडों (जैसे लाइन भूखंड , तितर बितर भूखंड , बार भूखंड , समोच्च भूखंड ) के सीधे सामान्यीकरण के अलावा, कई सतह प्लॉटिंग विधियाँ उपलब्ध हैं, उदाहरण के लिए ax.plot_surface
:
# generate example data
import numpy as np
x,y = np.meshgrid(np.linspace(-1,1,15),np.linspace(-1,1,15))
z = np.cos(x*np.pi)*np.sin(y*np.pi)
# actual plotting example
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# rstride and cstride are row and column stride (step size)
ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap='hot')
ax.set_xlabel(r'$x$')
ax.set_ylabel(r'$y$')
ax.set_zlabel(r'$\cos(\pi x) \sin(\pi y)$')
plt.show()