使用 Matplotlib 旋转矩阵
Rotate a matrix with Matplotlib
我正在旋转 n x n 矩阵(n = 20,尽管它可能会改变)向右 30 度 使用 Matplotlib 的 转换 方法。
出现错误是因为旋转是从顶部而不是从底部执行的。
我试图通过 np.flip()
或 ax.imshow(origin = 'lower')
来反转索引,但它也会反转三角形,所以我需要发现如何设置 变换原点 .
Defintley,这是我想得到的:
请注意,符合对角矩阵的小方块将变成三角形。这可以做到吗?也许通过 returns 半个像素的 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)
我没有使用 Matplotlib 的三角形 class,因为三元图是通过插值运算表示的,我想表示原始矩阵值。
非常感谢有人的帮助。非常感谢您。
您可以将它与 x 方向的平移链接起来,而不是更改倾斜变换的原点,以实现您正在寻找的变换。
请注意,skew
变换以弧度表示角度(您使用的是度数)。如果你想以度为单位工作,有一个等效的 skew_deg
转换,但在这里我只以弧度工作。
另请注意,我认为您想要一个底边和高度都等于 20(或您选择 N 的任何值)的等腰三角形,您想要的角度不是 30 度,但实际上是 arctan(1/ 2) (=26.56deg).
您需要在 x 方向平移的量是 xtrans = N * np.tan(angle)
。
您可以在 matplotlib 中轻松地进行链式变换。这里我们可以先倾斜,再翻译:
mtransforms.Affine2D().skew(-angle, 0).translate(xtrans, 0)
请注意,此脚本适用于任何 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
对于 N = 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()
我正在旋转 n x n 矩阵(n = 20,尽管它可能会改变)向右 30 度 使用 Matplotlib 的 转换 方法。
出现错误是因为旋转是从顶部而不是从底部执行的。
我试图通过 np.flip()
或 ax.imshow(origin = 'lower')
来反转索引,但它也会反转三角形,所以我需要发现如何设置 变换原点 .
Defintley,这是我想得到的:
请注意,符合对角矩阵的小方块将变成三角形。这可以做到吗?也许通过 returns 半个像素的 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)
我没有使用 Matplotlib 的三角形 class,因为三元图是通过插值运算表示的,我想表示原始矩阵值。
非常感谢有人的帮助。非常感谢您。
您可以将它与 x 方向的平移链接起来,而不是更改倾斜变换的原点,以实现您正在寻找的变换。
请注意,skew
变换以弧度表示角度(您使用的是度数)。如果你想以度为单位工作,有一个等效的 skew_deg
转换,但在这里我只以弧度工作。
另请注意,我认为您想要一个底边和高度都等于 20(或您选择 N 的任何值)的等腰三角形,您想要的角度不是 30 度,但实际上是 arctan(1/ 2) (=26.56deg).
您需要在 x 方向平移的量是 xtrans = N * np.tan(angle)
。
您可以在 matplotlib 中轻松地进行链式变换。这里我们可以先倾斜,再翻译:
mtransforms.Affine2D().skew(-angle, 0).translate(xtrans, 0)
请注意,此脚本适用于任何 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
对于 N = 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()