Как удалить верхнюю и правую оси в matplotlib?

134

Вместо стандартного стиля оси «в рамке» я хочу иметь только левую и нижнюю оси, то есть:

+------+         |
|      |         |
|      |   --->  |
|      |         |
+------+         +-------

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

Майкл Кун
источник

Ответы:

154

Это предлагаемое решение Matplotlib 3 с официального сайта ЗДЕСЬ :

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

ax = plt.subplot(111)
ax.plot(x, y)

# Hide the right and top spines
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

plt.show()

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

divenex
источник
2
Это лучше, чем принятый ответ в новых версиях matplotlib.
Ffledgling
3
Дополнительный вопрос для новичков: где можно найти этот ответ на основе документа API Matplotlib? Если я пойду туда: matplotlib.org/api/axes_api.html Я не вижу никакой ссылки на spineобъект, и я бы не догадался об этом ключевом слове.
Эрик Бурел
63

В качестве альтернативы, это

def simpleaxis(ax):
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

похоже, достигается тот же эффект на оси без потери поддержки поворотной метки.

(Matplotlib 1.0.1; решение, вдохновленное этим ).

timday
источник
33

[править] matplotlib сейчас (2013-10) в версии 1.3.0, которая включает это

Эта способность была добавлена ​​только что, и для этого вам понадобится версия Subversion. Вы можете увидеть пример кода здесь .

Я просто обновляюсь, чтобы сказать, что сейчас в сети есть лучший пример . Тем не менее, версия Subversion все еще нужна, с ней еще не было выпуска.

[править] Matplotlib 0.99.0 RC1 только что был выпущен и включает эту возможность.

Autoplectic
источник
Убедитесь, что вы прочитали предупреждение на matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/… о неполной поддержке галочки, прежде чем пытаться использовать вышеуказанное, например, с повернутыми этикетками!
Timday 04
Похоже, это зависит от того, как вы строите ось. Оси, созданные с помощью, mpl.subplotsнельзя использовать таким образом?
Стефан ван дер Уолт
8
Ссылка на пример теперь не работает.
mkosmala
10

(Это скорее дополнительный комментарий, помимо исчерпывающих ответов здесь.)


Обратите внимание, что мы можем скрыть каждый из этих трех элементов независимо друг от друга:

  • Чтобы скрыть границу (также известную как «позвоночник»): ax.set_frame_on(False)илиax.spines['top'].set_visible(False)

  • Чтобы скрыть галочки: ax.tick_params(top=False)

  • Чтобы скрыть метки: ax.tick_params(labeltop=False)

Евгений Сергеев
источник
красивое резюме возможностей. +1
Loved.by.Jesus
9

Если вам не нужны галочки и тому подобное (например, для построения качественных иллюстраций), вы также можете использовать этот быстрый обходной путь:

Сделайте оси невидимыми (например, с помощью plt.gca().axison = False), а затем нарисуйте их вручную с помощью plt.arrow.

nikow
источник
1
это, кажется, удаляет колючки, но оставляет отметины на месте. Есть идеи, как убрать клещи?
Роб Янг
2
@Rob: Вы правы, я на самом деле использовал другое решение в сценарии, о котором думал. Я изменил свой ответ, теперь он должен работать, но в целом принятое выше решение лучше.
nikow
9

В библиотеке Seaborn это встроено с функцией despine ().

Просто добавь:

import seaborn as sns

Теперь создайте свой график. И в конце добавить:

sns.despine()

Если вы посмотрите на некоторые значения параметров по умолчанию для функции, она удалит верхний и правый стержень и оставит нижний и левый стержень:

sns.despine(top=True, right=True, left=False, bottom=False)

Дополнительную документацию можно найти здесь: https://seaborn.pydata.org/generated/seaborn.despine.html

Сандер ван ден Оорд
источник
7

Если вам нужно удалить его со всех ваших графиков, вы можете удалить шипы в настройках стиля (таблица стилей или rcParams). Например:

import matplotlib as mpl

mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False

Если вы хотите удалить все шипы:

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False
HHH
источник