Меня всегда смущает, как комментировать вещи в matplotlib, и я погружаюсь глубже и открываю волшебный мир различных систем координат, существующих в matplotlib, но мне трудно все это понять.
Начиная с системы осей, при аннотировании я получил вот что:
from matplotlib import pyplot as plt
fig,ax = plt.subplots( figsize=(5,5), dpi=300)
ax.set_xlim(0,100)
ax.set_ylim(0,1000)
# -- Annotations --------------------------------
#coordinate system same as data xy = (100,1000)
ax.annotate(
xy=(80,800),
text='*1 -data',
ha='left', va='top',
xycoords = "data"
)
#coordinates system xy = (0,1) from the axes
ax.annotate(
xy=(0.5,1.1),
text='*2 - axes fraction',
ha='left', va='top',
xycoords='axes fraction'
)
#combine data and axes fraction
ax.annotate(
xy=(30,0.5), #x = 30 and y is the middle of y axes
text='*3 -data, axes fraction',
ha='left', va='top',
xycoords=('data','axes fraction')
)
#coordinates system xy = (?,?) from the axes
ax.annotate(
xy=(50,50),
text='*4 - axes points',
ha='left', va='top',
xycoords='axes points'
)
#coordinates system xy = (?,?) from the axes
ax.annotate(
xy=(750,750),
text='*5 - axes pixels',
ha='left', va='top',
xycoords='axes pixels'
)
#annotation for the points coordinate system and xy locations.
t = "Footnotes:\n(1) data, coord @ (100,1000), plotted @ (80,800)\n(2) axes fraction, coord @ (0,1), plotted @ (0.5,1.1)\n(3) data,axes points combined, coord @ x=(0,100), y=(0,1) plotted @ (30,0.5)\n(4) axes points coord @ (?,?) plotted @ (50,50)\n(5)axes pixels, coord @ (?,?) plotted @ (750,750)"
ax.annotate(
xy=(0,-0.1),
text = t,
ha = "left", va= "top", color = "grey",
xycoords = "axes fraction"
)
Что генерирует это:
Очевидно, я прочитал документацию, но до сих пор не понял этого:
Почему, когда я указываю координаты xy вне осей (пример 2), они все равно отображаются на графике? Я ожидал, что мне придется использовать annotation_clip.
Каковы координаты системы точек осей? Полностью потерялся в этом вопросе.
Каковы координаты системы пикселей осей? Я знаю, что цифра 1500x1500, но как это переводится в оси? Я не ожидал, что там будет изображен пример 5.
Каковы координаты системы точек осей? Полностью потерялся в этом вопросе.
Точки осей см. здесь: https://graphicdesign.stackexchange.com/a/207
Точка равна 1/72 дюйма. Вы указали 300 dpi, то есть 300 пикселей на дюйм - думаю, это технически не правильно, но вроде работает^{TM}. Вы разместили аннотацию в точке (50,50) по осям. Это 50/72 дюйма, или 50/72*300 пикселей от (0,0).
Каковы координаты системы пикселей осей? Я знаю, что цифра 1500x1500, но как это переводится в оси? Я не ожидал, что там будет изображен пример 5.
Пиксели осей — это просто пиксели осей, отсчитываемые снизу слева (0,0). Это не сразу очевидно из-за выбранной вами аннотации, но если вы аннотируете, например. используя только знак минус дважды: один слева, один справа, оба по центру по вертикали, вы должны увидеть, что точка находится на 750 пикселей вдоль.
ax.annotate(xy=(750, 750), text = "-", ha = "left", va = "center", xycoords = "axes pixels")
ax.annotate(xy=(750, 750), text = "-", ha = "right", va = "center", xycoords = "axes pixels")
Спасибо! Если я построю график 50/72*300 с использованием осей пикселей, он будет отображаться в той же позиции, так что это имеет смысл! Что касается объяснения осей пикселей, я нарисовал обе аннотации, но я до сих пор не понимаю, как работает 750? так как цифра 1500 на 1500, оси тоже одинаковые? и в этом случае я ожидаю, что он будет посередине, но он будет немного правее? Боюсь, я все еще в замешательстве. С фигурными осями он помещается посередине. Что мне не хватает?
750 пикселей отсчитываются от начала координат, т.е. точки (0,0). Это положение не будет посередине, но оно будет смещено на количество пикселей слева и ниже осей.
ок, а как мне узнать середину осей или как узнать, насколько велико смещение? Спасибо за терпение, кстати
Извините, я не знаю, как это сделать программно с подсчетом пикселей. Вот тут-то и появляются все остальные различные системы координат (доли осей для данного конкретного случая).
Последний вопрос, обещаю! Что тогда было бы хорошим примером для осей пикселей? Может быть, он мало используется?
Например, при аннотировании фотографии или медицинского изображения. Вы будете знать пиксельные координаты любого объекта изображения за пределами Python, а затем сможете использовать эти внешние пиксельные координаты для аннотирования изображения в Python с помощью пикселей осей.
Я думаю, что документация все четко объясняет. Вот ссылка, которая поможет вам с различными демо