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

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

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

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

11 ответов

Решение

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

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()

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

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

[edit] matplotlib в настоящее время (2013-10) в версии 1.3.0, которая включает это

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

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

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

Если вам нужно удалить его со всех ваших графиков, вы можете удалить шипы в настройках стиля (таблица стилей или 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

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


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

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

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

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

Библиотека 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

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

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

Другой способ сделать это неглобальным способом - использоватьmatplotlib.pyplot.rc_contextменеджер контекста, как показано ниже:

      with plt.rc_context({
    "axes.spines.right": False,
    "axes.spines.top": False,
}):
    fig, ax = plt.subplots()
    ...

Хотя принятый ответ хорош, если все, что вы хотите сделать, это отключить линии осей, я бы посоветовал ознакомиться с.set()функцию, так как вы можете передавать дополнительные kwargs, управляющие стилем линии, толщиной и т. д. и т. д., что делает ваш код более гибким и пригодным для повторного использования. Это также сокращает количество функций matplotlib, которые вам нужно изучить.

Оп может сделать это:

      ax.spines.top.set(visible=False)
ax.spines.right.set(visible=False)

но вы можете так же легко сделать что-то вроде этого:

      ax.spines.right.set(color='red', linestyle='--', linewidth=2, position=['data',2])
ax.spines.top.set(color='red', linestyle='--', linewidth=2, position=['data',5])

Смотрите документацию здесь .

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

      axes.spines.left:   True
axes.spines.bottom: True
axes.spines.top:    False
axes.spines.right:  False

Это гораздо более элементарно, но может помочь:

remove_border ()

Другие вопросы по тегам