Matplotlib के साथ एक मैट्रिक्स घुमाएँ
मैं कर रहा हूँ घूर्णन anxn मैट्रिक्स (n = 20 है, हालांकि यह बदल सकता है) 30 डिग्री दाये matplotlib का उपयोग परिवर्तन के तरीकों।
त्रुटि दिखाई देता है क्योंकि रोटेशन और आधार से नहीं ऊपर से perfomed है। मैंने सूचकांक के माध्यम से उलटा करने की कोशिश की है np.flip()या ax.imshow(origin = 'lower')यह त्रिकोण को उल्टा कर रहा है, इसलिए मुझे यह पता लगाने की आवश्यकता है कि परिवर्तन मूल बिंदु को कैसे सेट किया जाए ।
Defintley, यह वही है जिसे मैं प्राप्त करना चाहता हूं :
ध्यान दें कि विकर्ण मैट्रिक्स के अनुरूप छोटे वर्ग त्रिकोण में बदल जाएंगे। यह किया जा सकता है? शायद एक imshow विधि द्वारा जो आधा पिक्सेल लौटाता है? बाकी के पिक्सेल्स वही रहेंगे (विकृत छोटे वर्ग)।
यहाँ मैट्रिक्स उत्पन्न करने के लिए कोड है ( प्रारंभिक बिंदु ):
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
matrix = np.random.rand(20,20)
# Generate a boolean matrix (same shape than 'matrix') and select lower triangle values:
condition = np.tril(np.ones((matrix.shape))).astype(np.bool)
triangle = np.where(condition, matrix, np.nan)
fig, ax = plt.subplots(figsize = (8,8))
ax.imshow(triangle, cmap = 'Spectral')
और यहाँ कोड इसे घुमाने की कोशिश कर रहा है :
im = ax.imshow(matrix, cmap = 'Spectral')
im.set_transform(mtransforms.Affine2D().skew(30, 0) + ax.transData)
ax.plot(transform = trans_data)
मैं मैटलपोटलिब के त्रिभुज वर्ग का उपयोग नहीं कर रहा हूं क्योंकि टर्नरी आरेख को एक प्रक्षेप ऑपरेशन के माध्यम से प्रस्तुत किया जाता है, और मैं मूल मैट्रिक्स मूल्यों का प्रतिनिधित्व करना चाहता हूं।
मैं वास्तव में किसी की मदद की सराहना करता हूं। पहले से ही बहुत - बहुत धन्यवाद।
जवाब
तिरछा परिवर्तन की उत्पत्ति को बदलने के बजाय, आप उस परिवर्तन को प्राप्त करने के लिए एक्स दिशा में अनुवाद के साथ श्रृंखला बना सकते हैं।
ध्यान दें कि skewपरिवर्तन रेडियन में एक कोण लेता है (आप इसे डिग्री के साथ उपयोग कर रहे थे)। skew_degयदि आप डिग्री में काम करना चाहते हैं तो एक समान रूपांतर है, लेकिन यहां मैं सिर्फ रेडियंस में काम करता हूं।
ध्यान दें कि मुझे लगता है कि आप एक समद्विबाहु त्रिभुज बनाना चाहते हैं जिसका आधार और ऊंचाई दोनों 20 (या जो कुछ भी आप एन होना चाहते हैं) के बराबर है, जो कोण आप चाहते हैं वह 30 डिग्री नहीं है, लेकिन वास्तव में आर्कटिक (1/2) (= 26.56) डिग्री)।
आपको x दिशा में जिस राशि का अनुवाद करना है, वह है xtrans = N * np.tan(angle)।
आप matplotlib में आसानी से चेन ट्रांसफॉर्म कर सकते हैं। यहां हम पहले तिरछा कर सकते हैं, फिर अनुवाद कर सकते हैं:
mtransforms.Affine2D().skew(-angle, 0).translate(xtrans, 0)
ध्यान दें कि यह स्क्रिप्ट एन के किसी भी मूल्य के लिए काम करती है।
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
N = 20
matrix = np.random.rand(N, N)
# Generate a boolean matrix (same shape than 'matrix') and select lower triangle values:
condition = np.tril(np.ones((matrix.shape))).astype(np.bool)
triangle = np.where(condition, matrix, np.nan)
fig, ax = plt.subplots(figsize = (8,8))
im = ax.imshow(triangle, cmap = 'Spectral')
angle = np.arctan(1/2)
xtrans = N * np.tan(angle)
im.set_transform(mtransforms.Affine2D().skew(-angle, 0).translate(xtrans, 0) + ax.transData)
ax.set_xlim(-0.5, N + 0.5)
plt.show()
एन = 20 के लिए
और एन = 30 के लिए
मैं अंत में एक समबाहु त्रिभुज स्केलिंग y-axis प्राप्त करता हूं। मुझे कोड दिखाया गया है।
इसलिए, यह एक मैट्रिक्स को एक समभुज त्रिभुज में बदलने की अनुमति देता है , जो मेरे पिछले प्रश्न का उत्तर देता है:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
import matplotlib
bins = 50
Z = np.random.rand(bins, bins)
# Generate a boolean matrix (same shape than 'matrix') and select lower triangle values:
condition = np.tril(np.ones((Z.shape))).astype(np.bool)
Z = np.where(condition, Z, np.nan)
fig, ax = plt.subplots(figsize = (8,8))
im = ax.imshow(Z, cmap = 'Spectral')
# Required angles (in Rad)
alpha = np.arctan(1/2) # 26 deg angle, in radians.
beta = np.arctan(np.pi/6) # 30 deg angle, in radians.
# Coefficients:
xtrans = np.sin(beta) * bins
scale_y = np.cos(beta)
# Transformation:
im.set_transform(mtransforms.Affine2D().skew (-alpha, 0)
.scale (1,scale_y)
.translate (xtrans, 0)
+ ax.transData)
ax.set_ylim(bins,-5)
ax.set_xlim(-5,bins)
plt.show()