如何在matplotlib中转换坐标轴

How to transform the coordinate axes in matplotlib

我想从 meshgrid 函数开始绘制一个六边形格子,它给我一个正方形格子。

import numpy as np
import matplotlib.pyplot as plt

xx, yy = np.meshgrid(np.arange(10), np.arange(10), indexing='ij')
plt.scatter(xx,yy)
plt.show()

如果用包含六角点阵基向量的矩阵 A 变换所有点,我得到:

A = np.array([[3./2, 3./2],[np.sqrt(3)/2, -np.sqrt(3)/2]])
pts = np.einsum('ij,jk->ik',A,np.array([xx.flatten(),yy.flatten()]))
plt.scatter(pts[0,:], pts[1,:])
plt.show()

我认为如果不变换每个点,我可以只变换坐标系的轴以获得相同的结果,那会更优雅。 matplotlib 中是否有一个函数允许我将基向量从 [1,0] 和 [0,1] 更改为 [3./2, sqrt(3)/2] 和 [3./2, -sqrt( 3)/2]?或者我可以给np.meshgrid一个这样的矩阵吗?

您可以为散点提供仿射变换以倾斜旋转点。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as mtrans

xx, yy = np.meshgrid(np.arange(10), np.arange(10))
A = np.array([[3./2, 3./2, 0],[np.sqrt(3)/2, -np.sqrt(3)/2, 0], [0,0,1]])

fig, ax = plt.subplots()
plt.scatter(xx.flat, yy.flat, transform=mtrans.Affine2D(A) + ax.transData)
plt.show()