Скрытие текстов осей в графиках Matplotlib
Я пытаюсь построить график без меток и чисел на осях (использую оси в традиционном смысле, а не в номенклатуре 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()
Три вопроса, которые я хотел бы задать:
- Как отключить это поведение изначально (хотя в большинстве случаев оно полезно, но не всегда)! Я просмотрел
matplotlib.axis.XAxis
, но не нашел ничего подходящего. - Как сделать так, чтобы N исчезло (например, используя
X.set_visible(False)
)? - Есть ли лучший способ сделать вышеперечисленное? Мой конечный график будет содержать 4x4 подграфика, если это имеет значение.
5 ответ(ов)
Вместо того чтобы скрывать каждый элемент отдельно, вы можете скрыть целую ось:
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()
, чтобы добавить подписи к осям.
Если вы хотите скрыть только текст на осях, при этом оставив сетку видимой, вы можете использовать следующий код:
frame1 = plt.gca()
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])
Обратите внимание, что использование set_visible(False)
или set_ticks([])
также скроет линии сетки, поэтому лучше использовать метод set_ticklabels([])
, чтобы только удалить метки, не подвергая это воздействию линии сетки.
Если вы, как и я, не всегда получаете объект осей ax
, когда строите фигуру, простое решение будет следующим:
plt.xticks([])
plt.yticks([])
Этот код уберёт метки с осей X и Y, что может помочь, если вы хотите создать более чистую визуализацию без лишней информации на графике.
Я не смог отобразить изображение без границ или данных оси, основываясь на кодовых фрагментах, представленных здесь (даже на том, который был принят в качестве ответа). После изучения документации 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
, чтобы фактически отключить любую лишнюю информацию, которая могла бы отображаться, и в итоге получил идеальный график в выходном файле.
Несколько устаревшая тема, но, похоже, это более быстрый метод с использованием последней версии matplotlib:
Установите основной форматировщик для оси x:
ax.xaxis.set_major_formatter(plt.NullFormatter())
Когда использовать cla(), clf() или close() для очистки графика?
Сохранить график в файл изображения вместо его отображения
Как задать пределы осей в Matplotlib?
Размер маркеров в графиках рассеяния с помощью pyplot
Построение графиков с логарифмическими осями