matplotlib поділяє вісь x, але не показує мітки галочок осі x для обох, лише для однієї


80

Я використовую python + matplotlib, і у мене є дві ділянки, що ділять вісь. Якщо ви намагаєтеся встановити graph1.set_xticklabels([])під час спільного використання осі, це не матиме ефекту, оскільки вона є спільною. Чи є спосіб поділити вісь І мати можливість приховати вісь х однієї ділянки?

Відповіді:


115

Це загальна помилка при використанні спільних осей.

На щастя, є просте виправлення: використовуйте, 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()

текст заміщення


8
У мене була обернена проблема: мітки на другому підзаговоренні не відображалися. так що я використовував вашу команду: plt.setp(ax2.get_yticklabels(), visible=True). Працювали бездоганно.
n1000

49

Для потоку на matplotlib-користувачах ви могли б використовувати

import matplotlib.pyplot as plt
for ax in plt.gcf().axes:
    try:
        ax.label_outer()
    except:
        pass

1
Я би хотів, щоб я проголосував за це більше, бо це набагато корисніше, ніж прийнята відповідь. Єдина ситуація, коли ви хочете змінити видимість, а не просто усунути їх, - на підпрограмах; і ваша відповідь у цьому випадку набагато розумніша. Дякую!
Channing Moore

Навіщо це tryпотрібно? Здається, добре і без цього.
EL_DON

1
tryнеобхідний, оскільки не всі елементи plt.gcf().axesсписку гарантовано є subplotекземплярами (із label_outerметодом).
esmit

16

Ви можете використовувати 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)

Встановлення labelbottom = True вирішило це для мене у зворотному випадку. Дякую.
mclzc

У мене теж працював у протилежному випадку, тоді як plt.setp (ax [1] .get_yticklabels (), visible = True) ні.
декард

5

Ви можете поділитися осями під час створення підзаговора з plt.subplotsas

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

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


але якщо ви спробуєте перенести кліщі на іншу сторону сюжету, ярлики повертаються: /
ендоліт

Так, правда, у такому особливому випадку вам потрібно знову встановити їх невидимими.
ImportanceOfBeingErnest

label_outer()здається, працює stackoverflow.com/a/12751192/125507
ендоліт

Так, усі відповіді тут відповідають на питання !?
ImportanceOfBeingErnest

0

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

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

до якого ви можете зателефонувати раніше plt.show(). Відповідь Джо Кінгтона мені чомусь не спрацювала.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.