Преобразование координат Сиборн / Матплотлиб - PullRequest
0 голосов
/ 24 апреля 2019

Как я могу преобразовать координаты графика, где 0,0 - левый нижний угол, а 1,1 - верхний правый, в координаты значений X и Y, показанных на графике ниже?

Чего я хочу добиться, так это нарисовать метки A, V, U, I и M в верхней части графика, примерно на высоте, где находится метка «Дополнительная информация», но сохранить положение X. Количество точек на графике регрессии будет различным, поэтому его нельзя будет жестко закодировать.

Я пытался использовать transData и transAxes, которые описаны здесь https://matplotlib.org/tutorials/advanced/transforms_tutorial.html,, но я не смог преобразовать в способ, который здесь преобразует координату Y от 0,8 до приблизительно 26.

Преобразование в обратном направлении также будет работать, но тогда потребуется преобразовать координату X, т. Е. От 2,5 до 0,2. enter image description here

import seaborn as sns
import numpy as np
import pandas as pd

status = ['A', 'V', 'U', 'I', 'M']
x_array = np.array([2, 4, 6, 8, 10])
y_array = np.array([5, 9, 15, 21, 27])
x, y = pd.Series(x_array, name="Values X"), pd.Series(y_array, name="Values Y")
ax_regplot = sns.regplot(x=x, y=y, scatter=True)
ax_regplot.set_title("My plot")
ax_regplot.figure.text(0.2, 0.8, "Additional Information", fontsize=8)

for i in range(len(x_array)):
    x_coordinate = x_array[i]
    y_coordinate = y_array[i]
    ax_regplot.text(x_coordinate, y_coordinate, status[i])

ax_regplot.figure.savefig("my_plot.png")

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Вы действительно можете работать в нескольких системах координат здесь. Идея состоит в том, что координата y ваших текстовых элементов указывается в единицах осей (в диапазоне от 0 до 1 по площади осей), а координаты x - в единицах данных. Например, буква «А» должна быть установлена ​​на (2, 0.8), где 2 - это единицы данных, а 0,8 - оси. Такая система называется «смешанной системой координат». Мы могли бы вручную создать такие смешанные системы или использовать преобразование xaxis, которое в любом случае использует эту точную систему.

Использование annotate вместо text дополнительно позволяет добавлять небольшие смещения в точках к текстам. Это может использоваться для того, чтобы дать и тексту заголовка, и букве одну и ту же координату оси, но все же сместить их на несколько точек относительно друг друга.

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

status = ['A', 'V', 'U', 'I', 'M']
x = np.array([2, 4, 6, 8, 10])
y = np.array([5, 9, 15, 21, 27])


ax = sns.regplot(x=x, y=y, scatter=True)
ax.set_title("My plot")


ax.annotate("Additional Information", xy=(0,0.8), xytext=(20, 10),
                   xycoords="axes fraction", textcoords="offset points",
                   fontsize=8)

for i in range(len(x)):
    ax.annotate(status[i], xy=(x[i], 0.8), xytext=(0, -2),
                   xycoords=ax.get_xaxis_transform(), textcoords="offset points",
                   fontsize=10, ha="center")

plt.show()

enter image description here

0 голосов
/ 24 апреля 2019

Вы можете просто получить максимальное значение Y, используя get_ylim(), и масштабировать его столько, сколько хотите (в приведенном ниже примере я беру 0,8 от максимального значения).
get_ylim() возвращает кортеж с нижней и верхней границами оси, мы выбираем верхнюю с помощью индексации [1].

status = ['A', 'V', 'U', 'I', 'M']
x_array = np.array([2, 4, 6, 8, 10])
y_array = np.array([5, 9, 15, 21, 27])
x, y = pd.Series(x_array, name="Values X"), pd.Series(y_array, name="Values Y")
ax_regplot = sns.regplot(x=x, y=y, scatter=True)
ax_regplot.set_title("My plot")
ax_regplot.figure.text(0.2, 0.8, "Additional Information", fontsize=8)

Нам просто нужно изменить последнюю строку в вашем цикле:

for i in range(len(x_array)):
    x_coordinate = x_array[i]
    y_coordinate = y_array[i]
    ax_regplot.text(x_coordinate, 0.8*ax_regplot.get_ylim()[1], status[i])

EDIT:

Следуя комментарию @ Роба, вы можете обобщить ответ на:

ylim=ax_regplot.get_ylim()
for i in range(len(x_array)):
    x_coordinate = x_array[i]
    y_coordinate = y_array[i]
    ax_regplot.text(x_coordinate, ylim[0] + .8 * (ylim[1] - ylim[0]), status[i])

example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...