Matplotlib ile bir matrisi döndürün
I am döner (o değiştirebilir olsa da, n = 20) anxn matrisi 30 derece sağa Matplotlib en kullanarak transformasyon yöntemleri.
Hata dönüş üstten perfomed olup tabanından, çünkü görünür. İndeksi ters çevirmeyi denedim np.flip()veya ax.imshow(origin = 'lower')bu aynı zamanda üçgeni de tersine çevirdi, bu yüzden dönüşüm başlangıç noktasını nasıl ayarlayacağımı keşfetmem gerekiyor .
Defintley, elde etmek istediğim şey bu :
Köşegen matrise uyan küçük karelerin üçgenlere dönüşeceğini unutmayın. Bu yapılabilir mi? Belki yarım piksel döndüren bir imshow yöntemiyle? Piksellerin geri kalanı aynı kalacaktır (deforme olmuş küçük kareler).
Matrisi oluşturmak için kod ( başlangıç noktası ):
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')
Ve işte onu döndürmeye çalışan kod :
im = ax.imshow(matrix, cmap = 'Spectral')
im.set_transform(mtransforms.Affine2D().skew(30, 0) + ax.transData)
ax.plot(transform = trans_data)
Matplotlib'in Triangle sınıfını kullanmıyorum çünkü üçlü diyagram bir enterpolasyon işlemi aracılığıyla temsil ediliyor ve orijinal matris değerlerini temsil etmek istiyorum.
Birinin yardımına gerçekten minnettarım. Şimdiden çok teşekkür ederim.
Yanıtlar
Eğriltme dönüşümünün kaynağını değiştirmek yerine, aradığınız dönüşümü elde etmek için onu x yönünde bir öteleme ile zincirleyebilirsiniz.
skewDönüşümün radyan cinsinden bir açı aldığını unutmayın (bunu derecelerle kullanıyordunuz). skew_degDerece olarak çalışmak isterseniz eşdeğer bir dönüşüm var, ancak burada sadece radyan cinsinden çalışıyorum.
Ayrıca, tabanı ve yüksekliği hem 20'ye eşit olan (veya N'yi seçerseniz seçin) bir ikizkenar üçgene sahip olmak istediğinizi düşündüğüme dikkat edin, istediğiniz açı 30 derece değil, aslında arktan (1/2) (= 26.56 derece).
X yönünde çevirmeniz gereken miktar xtrans = N * np.tan(angle).
Matplotlib'de dönüşümleri kolaylıkla zincirleyebilirsiniz. Burada önce çarpıtabilir, sonra çevirebiliriz:
mtransforms.Affine2D().skew(-angle, 0).translate(xtrans, 0)
Bu komut dosyasının herhangi bir N değeri için çalıştığını unutmayın.
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()
N = 20 için
Ve N = 30 için
Sonunda y eksenini ölçeklendiren bir eşkenar üçgen elde ettim, burada kodu gösteriyorum.
Bu nedenle, bir matrisi eşkenar üçgene dönüştürmeye izin verir , önceki soruma cevap veren şey:
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()