Преобразование из координат данных в координаты осей в matplotlib - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь преобразовать точки данных из системы координат данных в систему координат осей в matplotlib.

import matplotlib.pyplot as plt


fig, ax = plt.subplots()
# this is in data coordinates
point = (1000, 1000)
# this takes us from the data coordinates to the display coordinates.
trans = ax.transData.transform(point)
print(trans)  # so far so good.
# this should take us from the display coordinates to the axes coordinates.
trans = ax.transAxes.inverted().transform(trans)
# the same but in one line
# trans = (ax.transData + ax.transAxes.inverted()).transform(point)
print(trans)  # why did it transform back to the data coordinates? it
# returns [1000, 1000], while I expected [0.5, 0.5]
ax.set_xlim(0, 2000)
ax.set_ylim(0, 2000)
ax.plot(*trans, 'o', transform=ax.transAxes)
# ax.plot(*point, 'o')
fig.show()

Я прочитал руководство по преобразованию и попробовал решение, представленное в этот ответ , на котором основан мой код, но он не работает. Я просто не могу понять почему, и это сводит меня с ума. Я уверен, что есть простое решение, но я его просто не вижу.

Ответы [ 2 ]

2 голосов
/ 25 мая 2020

Преобразование работает, просто когда вы начинаете, пределы осей по умолчанию равны 0, 1, и он не знает заранее, что вы планируете изменить пределы:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
# this is in data coordinates
point = (1000, 1000)
trans = ax.transData.transform(point)
trans = ax.transAxes.inverted().transform(trans)
print(ax.get_xlim(), trans)  

ax.set_xlim(0, 2000)
ax.set_ylim(0, 2000)
trans = ax.transData.transform(point)
trans = ax.transAxes.inverted().transform(trans)
print(ax.get_xlim(), trans)

дает:

(0.0, 1.0) [1000. 1000.]
(0.0, 2000.0) [0.5 0.5]
1 голос
/ 25 мая 2020

Хорошо, я обнаружил (очевидную) проблему. Чтобы преобразование работало, мне нужно установить пределы осей перед вызовом преобразования, что, я думаю, имеет смысл.

import matplotlib.pyplot as plt


fig, ax = plt.subplots()
ax.set_xlim(0, 2000)
ax.set_ylim(0, 2000)
point = (1000, 1000)
trans = (ax.transData + ax.transAxes.inverted()).transform(point)
print(trans) 
ax.plot(*trans, 'o', transform=ax.transAxes)
# ax.plot(*point, 'o')
fig.show()
...