Есть ли способ построить Line2D в координатах точек в Matplotlib в Python?

это очень прямо вперед, чтобы построить линию между двумя точками (x1, y1) и (x2, y2) на Matplotlib используя Line2D:

Line2D(xdata=(x1, x2), ydata=(y1, y2))

но в моем конкретном случае я должен рисовать экземпляры Line2D, используя координаты точек поверх регулярных графиков, которые все используют координаты данных. Это возможно?

2 ответов


как упоминал @tom, ключ-это transform kwarg. Если вы хотите, чтобы данные исполнителя интерпретировались как находящиеся в координатах "пиксель", укажите transform=IdentityTransform().

С Помощью Преобразования

преобразования являются ключевым понятием в matplotlib. Преобразование принимает координаты, в которых находятся данные исполнителя, и преобразует их для отображения координат-другими словами, пикселей на экране.

если вы еще не видели его, дайте библиотек matplotlib трансформирует учебник быстрое чтение. Я собираюсь предположить мимолетное знакомство с первыми несколькими абзацами этого урока, поэтому, если вы

например, если мы хотим провести линию по всей фигуре, мы бы использовали что-то вроде:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# The "clip_on" here specifies that we _don't_ want to clip the line
# to the extent of the axes
ax.plot([0, 1], [0, 1], lw=3, color='salmon', clip_on=False, 
        transform=fig.transFigure)

plt.show()

enter image description here


эта строка всегда протяните от нижнего левого угла фигуры до верхнего правого угла, независимо от того, как мы интерактивно изменение размера/масштабирование / панорамирование участка.


рисунок в пикселях

наиболее общие преобразования вы будете использовать ax.transData, ax.transAxes и fig.transFigure. Однако, чтобы рисовать точки / пиксели, вы на самом деле не хотите никакого преобразования вообще. В этом случае вы создадите новый экземпляр преобразования, который ничего не делает:IdentityTransform. Это указывает, что данные для исполнителя находятся в "необработанных" пикселях.


в любое время, когда вы хотите построить в пикселях" raw", укажите transform=IdentityTransform() для художник.


если вы хотите работать в точках, вспомните, что есть 72 точки на дюйм, и что для matplotlib,fig.dpi управляет количеством пикселей в "дюйме" (он фактически не зависит от физического дисплея). Поэтому мы можем преобразовать точки в пиксели с помощью простой формулы.

в качестве примера, давайте разместим маркер 30 точек от нижнего левого края рисунок:

import matplotlib.pyplot as plt
from matplotlib.transforms import IdentityTransform

fig, ax = plt.subplots()

points = 30
pixels = fig.dpi * points / 72.0

ax.plot([pixels], [pixels], marker='o', color='lightblue', ms=20,
        transform=IdentityTransform(), clip_on=False)
plt.show()

enter image description here


Сочинения Превращает

одна из наиболее полезных вещей о преобразованиях matplotlib заключается в том, что их можно добавить для создания нового преобразования. Это позволяет легко создавать сдвиги.

например, давайте построим линию, а затем добавим другую линию, сдвинутую на 15 пикселей в направлении x:

import matplotlib.pyplot as plt
from matplotlib.transforms import Affine2D

fig, ax = plt.subplots()
ax.plot(range(10), color='lightblue', lw=4)

ax.plot(range(10), color='gray', lw=4,
        transform=ax.transData + Affine2D().translate(15, 0))

plt.show()

enter image description here

ключевая вещь, котор нужно держать внутри помните, что порядок дополнений имеет значение. Если бы мы это сделали!--12--> вместо этого мы бы сдвинули вещи на 15 сведения единицы вместо 15 пикселей. Добавленные преобразования "прикованы" (составленный был бы более точным термином) по порядку.

enter image description here


это также позволяет легко определить такие вещи, как "20 пикселей с правой стороны фигуры". Например:

import matplotlib.pyplot as plt
from matplotlib.transforms import Affine2D

fig, ax = plt.subplots()

ax.plot([1, 1], [0, 1], lw=3, clip_on=False, color='salmon',
        transform=fig.transFigure + Affine2D().translate(-20, 0))

plt.show()

enter image description here


можно использовать transform ключевое слово для изменения между координатами данных (по умолчанию) и координатами осей. Например:

import matplotlib.pyplot as plt
import matplotlib.lines as lines

plt.plot(range(10),range(10),'ro-')

myline = lines.Line2D((0,0.5,1),(0.5,0.5,0),color='b') # data coords

plt.gca().add_artist(myline)

mynewline = lines.Line2D((0,0.5,1),(0.5,0.5,0),color='g',transform=plt.gca().transAxes) # Axes coordinates

plt.gca().add_artist(mynewline)

plt.show()

enter image description here