Обратная ось Y в PyPlot

266

У меня есть график рассеяния с набором случайных координат x, y. В настоящее время ось Y начинается с 0 и достигает максимального значения. Я бы хотел, чтобы ось Y начиналась с максимального значения и доходила до 0.

points = [(10,5), (5,11), (24,13), (7,8)]    
x_arr = []
y_arr = []
for x,y in points:
    x_arr.append(x)
    y_arr.append(y)
plt.scatter(x_arr,y_arr)
DarkAnt
источник

Ответы:

557

Существует новый API, который делает это еще проще.

plt.gca().invert_xaxis()

и / или

plt.gca().invert_yaxis()
Demitri
источник
49
Имейте в виду, что вы должны установить пределы оси, прежде чем инвертировать ось, иначе она не будет инвертирована снова.
TheBigH
55

Ответ DisplacedAussie является правильным, но обычно более короткий метод состоит в том, чтобы просто повернуть одну ось в вопросе:

plt.scatter(x_arr, y_arr)
ax = plt.gca()
ax.set_ylim(ax.get_ylim()[::-1])

где gca()функция возвращает текущий экземпляр Axes и [::-1]переворачивает список.

Тим Уиткомб
источник
3
Это кажется лучшим ответом для меня. :)
Перемещенный
18

Используйте matplotlib.pyplot.axis ()

axis([xmin, xmax, ymin, ymax])

Таким образом, вы можете добавить что-то вроде этого в конце:

plt.axis([min(x_arr), max(x_arr), max(y_arr), 0])

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

DisplacedAussie
источник
Это имеет преимущество перед первыми двумя ответами, заключающееся в том, что он фиксирует ориентацию, а не переворачивает ее каждый раз (что является проблемой, если вам нужно вызывать ее в цикле).
Бас Суинкельс
16

Если вы находитесь в pylabрежиме ipython , то

plt.gca().invert_yaxis()
show()

show()требуется , чтобы сделать его обновить текущую фигуру.

charles.fox
источник
9

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

scatter = plt.scatter(x, y)
ax = scatter.axes
ax.invert_xaxis()
ax.invert_yaxis()
ShikharDua
источник
8

Другим способом, аналогичным описанному выше, является использование, plt.ylimнапример:

plt.ylim(max(y_array), min(y_array))

Этот метод работает для меня, когда я пытаюсь объединить несколько наборов данных на Y1 и / или Y2

Mortsde
источник
3

использование ylim () может быть лучшим подходом для вашей цели:

xValues = list(range(10))
quads = [x** 2 for x in xValues]
plt.ylim(max(quads), 0)
plt.plot(xValues, quads)

приведет к:введите описание изображения здесь

Фарзад Головокружение
источник
2

Кроме того, вы можете использовать функцию matplotlib.pyplot.axis () , которая позволяет инвертировать любую ось графика

ax = matplotlib.pyplot.axis()
matplotlib.pyplot.axis((ax[0],ax[1],ax[3],ax[2]))

Или, если вы предпочитаете повернуть только ось Х, то

matplotlib.pyplot.axis((ax[1],ax[0],ax[2],ax[3]))

Действительно, вы можете инвертировать обе оси:

matplotlib.pyplot.axis((ax[1],ax[0],ax[3],ax[2]))
Луис Д.Г.
источник
0

Если вы используете matplotlib, вы можете попробовать: matplotlib.pyplot.xlim(l, r) matplotlib.pyplot.ylim(b, t)

Эти две линии устанавливают пределы осей x и y соответственно. Для оси x первый аргумент l устанавливает самое левое значение, а второй аргумент r устанавливает самое правое значение. Для оси y первый аргумент b устанавливает самое нижнее значение, а второй аргумент t устанавливает самое верхнее значение.

Энди Тернер
источник