Как преобразовать оси координат в matplotlib - PullRequest
3 голосов
/ 17 февраля 2020

Я хочу построить гексагональную решетку, начиная с функции 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()

square lattice

Если преобразовать все точек матрицы 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()

enter image description here

Я думаю, что это было бы более элегантно если бы вместо преобразования каждой точки я мог просто преобразовать оси моей системы координат, чтобы получить тот же результат. Есть ли в matplotlib функция, позволяющая мне изменять базисные векторы с [1,0] и [0,1] на [3./2, sqrt (3) / 2] и [3./2, -sqrt ( 3) / 2]? Или я могу дать такую ​​матрицу np.meshgrid?

1 Ответ

5 голосов
/ 17 февраля 2020

Вы можете предоставить аффинное преобразование для разброса, чтобы наклонить и повернуть точки.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...