Сокрытие текста оси на графиках matplotlib

371

Я пытаюсь построить фигуру без отметок или чисел на любой из осей (я использую оси в традиционном смысле, а не номенклатуру matplotlib!). Проблема, с которой я столкнулся, заключается в том, что matplotlib корректирует метки x (y), вычитая значение N, а затем добавляет N в конце оси.

Это может быть расплывчато, но следующий упрощенный пример выдвигает на первый план проблему с '6.18', являющимся оскорбительным значением N:

import matplotlib.pyplot as plt
import random
prefix = 6.18

rx = [prefix+(0.001*random.random()) for i in arange(100)]
ry = [prefix+(0.001*random.random()) for i in arange(100)]
plt.plot(rx,ry,'ko')

frame1 = plt.gca()
for xlabel_i in frame1.axes.get_xticklabels():
    xlabel_i.set_visible(False)
    xlabel_i.set_fontsize(0.0)
for xlabel_i in frame1.axes.get_yticklabels():
    xlabel_i.set_fontsize(0.0)
    xlabel_i.set_visible(False)
for tick in frame1.axes.get_xticklines():
    tick.set_visible(False)
for tick in frame1.axes.get_yticklines():
    tick.set_visible(False)

plt.show()

Три вещи, которые я хотел бы знать:

  1. Как отключить это поведение в первую очередь (хотя в большинстве случаев это полезно, это не всегда!) Я просмотрел matplotlib.axis.XAxisи не могу найти ничего подходящего

  2. Как я могу заставить N исчезнуть (то есть X.set_visible(False))

  3. В любом случае, есть ли лучший способ сделать это? Мой последний сюжет будет 4x4 на графике, если это уместно.

Дейв
источник
У меня есть небольшое сомнение, если какой-либо из ответов здесь действительно ответит на вопрос. Мне кажется, вопрос состоит в том, как избавиться от смещения . Все же все ответы показывают различные способы, как избавиться от всех ticklabels. Если вопрос был заменен ответами, может быть, нужно отредактировать вопрос, чтобы спросить, для чего ответы дают решения?
ImportanceOfBeingErnest

Ответы:

472

Вместо того, чтобы скрывать каждый элемент, вы можете скрыть всю ось:

frame1.axes.get_xaxis().set_visible(False)
frame1.axes.get_yaxis().set_visible(False)

Или вы можете установить галочки в пустой список:

frame1.axes.get_xaxis().set_ticks([])
frame1.axes.get_yaxis().set_ticks([])

Во втором варианте вы все еще можете использовать plt.xlabel()и plt.ylabel()для добавления меток к осям.

Офри Равив
источник
2
Эй, Офри - это здорово, спасибо, но теперь (просто чтобы быть неловким), что произойдет, если я захочу добавить xlabel ()? Кроме ручного размещения текстового виджета.
Дэйв
5
Как вы можете расширить этот пример до 3d? ax = plt.gca (projection = '3d'), ax.axes.get_zaxis (). set_visible (False) дает'Axes3DSubplot' object has no attribute 'get_zaxis'
user989762
13
Этот ответ не позволяет показывать линии сетки. Ответ @saullo Castro делает, хотя ...
evan54
Проблема в том, что когда x_axis установлен в невидимое, сетка исчезает :( Редактировать: только что видел ответ @Saullo Castro, который исправил проблему.
Shailen
1
@ user989762 В вашем случае этот метод не будет работать, даже не get_xaxis().set_visible(False). Я думаю, что matplotlib в этом случае инициализирует некоторые параметры, как если бы график был 2D. ax.set_zticks([])будет делать то, что вы хотите
Кон Псих
222

Если вы хотите скрыть только текст оси, сохраняя линии сетки:

frame1 = plt.gca()
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])

Делать set_visible(False)или set_ticks([])также будет скрывать линии сетки.

Saullo GP Castro
источник
4
это удаляет ярлыки для всех сюжетных , что доля эта ось: /
эндолиты
136

Если вы похожи на меня и не всегда извлекаете оси ax, при построении фигуры, простое решение было бы сделать

plt.xticks([])
plt.yticks([])
Эбе Исаак
источник
56

В некотором роде старый поток, но, похоже, это более быстрый метод с использованием последней версии matplotlib:

установить основной форматер для оси X

ax.xaxis.set_major_formatter(plt.NullFormatter())
Ник Твердохлиб
источник
1
Что делать, если вы хотите сделать это только для одного тика?
tommy.carstensen
5
Да, это полезно, чтобы скрывать только метки, потому что .set_xticks ([]) также удаляет сами галочки.
zbyszek
49

На самом деле я не смог отрисовать изображение без границ или данных осей на основе какого-либо фрагмента кода (даже того, который был принят в ответе). Прочитав некоторую документацию по API, я нашел этот код для рендеринга своего изображения.

plt.axis('off')
plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off', labelright='off', labelbottom='off')
plt.savefig('foo.png', dpi=100, bbox_inches='tight', pad_inches=0.0)

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

GingerLoaf
источник
1
Когда оси совместно используются, решения, основанные на set_ticklabels, распространяются на совместно используемые оси. Только это решение, основанное на tick_params, работало нормально для меня.
Кристиан О'Рейли,
39

Я обозначил эту цифру цветом, чтобы облегчить процесс.

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)

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

Вы можете иметь полный контроль над рисунком, используя эти команды, чтобы завершить ответ, я добавил также контроль над сплайнами:

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# X AXIS -BORDER
ax.spines['bottom'].set_visible(False)
# BLUE
ax.set_xticklabels([])
# RED
ax.set_xticks([])
# RED AND BLUE TOGETHER
ax.axes.get_xaxis().set_visible(False)

# Y AXIS -BORDER
ax.spines['left'].set_visible(False)
# YELLOW
ax.set_yticklabels([])
# GREEN
ax.set_yticks([])
# YELLOW AND GREEN TOGHETHER
ax.axes.get_yaxis().set_visible(False)
GM
источник
ax.set_xticklabels([])и ax.set_xticks([])не работал для меня, но ax.axes.get_xaxis().set_visible(False)работал.
Хомеро Эсмеральдо
2
это должен быть принятый ответ
Jason S
6

При использовании объектно-ориентированного API у Axesобъекта есть два полезных метода для удаления текста оси, set_xticklabels()и set_xticks().

Скажем, вы создаете сюжет, используя

fig, ax = plt.subplots(1)
ax.plot(x, y)

Если вы просто хотите удалить метки, вы можете использовать

ax.set_xticklabels([])

или полностью удалить галочки, вы можете использовать

ax.set_xticks([])

Эти методы полезны для того, чтобы точно указать, где вы хотите поставить галочки и как вы хотите, чтобы они были помечены. Передача пустого списка приводит к отсутствию галочек или меток соответственно.

Стивен Хоуэлл
источник
2

Одним из трюков может быть установка белого цвета для ярлыков, чтобы скрыть это!

plt.xticks(color='w')
plt.yticks(color='w')
Венкатачалам
источник