Как удалить верхнюю и правую оси в 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()

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


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; решение, вдохновленное этим ).


33

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

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

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

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


Убедитесь, что вы прочитали предупреждение на 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.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.