Matplotlib делят ось X, но не отображают метки тика оси X для обоих, только один - PullRequest
76 голосов
/ 18 ноября 2010

Я использую python + matplotlib, и у меня есть два графика с общей осью. Если вы попытаетесь установить graph1.set_xticklabels([]) при совместном использовании оси, это не даст никакого эффекта, потому что оно является общим. Есть ли способ поделиться осью и иметь возможность скрыть ось х одного графика?

Ответы [ 5 ]

104 голосов
/ 18 ноября 2010

Это распространенная ошибка при использовании общих осей.

К счастью, есть простое решение: используйте plt.setp(ax.get_xticklabels(), visible=False), чтобы сделать метки невидимыми только на одной оси.

Это эквивалентно [label.set_visible(False) for label in ax.get_xticklabels()], во что бы то ни стало. setp будет автоматически работать с итерируемыми объектами matplotlib, а также с отдельными объектами.

Как пример:

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(range(10), 'b-')

ax2 = fig.add_subplot(2,1,2, sharex=ax1)
ax2.plot(range(10), 'r-')

plt.setp(ax1.get_xticklabels(), visible=False)

plt.show()

alt text

42 голосов
/ 05 октября 2012

За один поток на matplotlib-users , вы можете использовать

import matplotlib.pyplot as plt
for ax in plt.gcf().axes:
    try:
        ax.label_outer()
    except:
        pass
12 голосов
/ 26 апреля 2018

Вы можете использовать Axes.tick_params () :

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, sharex=ax1)

ax1.tick_params(labelbottom=False)
3 голосов
/ 23 июля 2017

Вы можете поделиться осями во время создания подзаговора с plt.subplots как

fig, axes = plt.subplots(nrows=2, sharex=True)

Это автоматически отключит метки для внутренних осей.

Полный пример:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, sharex=True)

axes[0].plot([1,2,3])
axes[1].plot([3,2,1])

plt.show()

enter image description here

0 голосов
/ 20 июня 2018

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

def remove_inner_ticklabels(fig):
    for ax in fig.axes:
        try:
            ax.label_outer()
        except:
            pass

, который вы можете позвонить до plt.show().Ответ Джо Кингтона почему-то у меня не сработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...