5

Скрытие текстов осей в графиках Matplotlib

13

Я пытаюсь построить график без меток и чисел на осях (использую оси в традиционном смысле, а не в номенклатуре 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 range(100)]
ry = [prefix+(0.001*random.random()) for i in range(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 ylabel_i in frame1.axes.get_yticklabels():
    ylabel_i.set_fontsize(0.0)
    ylabel_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 подграфика, если это имеет значение.

5 ответ(ов)

6

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

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(), чтобы добавить подписи к осям.

3

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

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

Обратите внимание, что использование set_visible(False) или set_ticks([]) также скроет линии сетки, поэтому лучше использовать метод set_ticklabels([]), чтобы только удалить метки, не подвергая это воздействию линии сетки.

2

Если вы, как и я, не всегда получаете объект осей ax, когда строите фигуру, простое решение будет следующим:

plt.xticks([])
plt.yticks([])

Этот код уберёт метки с осей X и Y, что может помочь, если вы хотите создать более чистую визуализацию без лишней информации на графике.

1

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

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

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

0

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

Установите основной форматировщик для оси x:

ax.xaxis.set_major_formatter(plt.NullFormatter())
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь