De schoonste manier om elk n-de vinkje in de matplotlib-kleurenbalk te verbergen?

De labels op mijn horizontale kleurenbalk staan ​​te dicht bij elkaar en ik wil de tekstgrootte niet verder verkleinen:

cbar = plt.colorbar(shrink=0.8, orientation='horizontal', extend='both', pad=0.02)
cbar.ax.tick_params(labelsize=8)

horizontale kleurenbalk met slechte labels

Ik wil alle vinkjes behouden, maar elk ander label verwijderen.

De meeste voorbeelden die ik heb gevonden, geven een door de gebruiker gespecificeerde lijst met strings door aan cbar.set_ticklabels(). Ik zoek een algemene oplossing.

Ik speelde met variaties van

cbar.set_ticklabels(cbar.get_ticklabels()[::2])

en

cbar.ax.xaxis.set_major_locator(matplotlib.ticker.MaxNLocator(nbins=4))

maar ik heb de magische combinatie niet gevonden.

Ik weet dat er een schone manier moet zijn om dit te doen met behulp van een locator-object.


Antwoord 1, autoriteit 100%

For loop de ticklabels, en bel set_visible():

for label in cbar.ax.xaxis.get_ticklabels()[::2]:
    label.set_visible(False)

Antwoord 2, autoriteit 24%

One-liner voor degenen die daar zin in hebben!

n = 7  # Keeps every 7th label
[l.set_visible(False) for (i,l) in enumerate(ax.xaxis.get_ticklabels()) if i % n != 0]

Antwoord 3, autoriteit 15%

Ik kwam net dit draadje tegen, leuke antwoorden.
Ik was op zoek naar een manier om elk vinkje tussen de nde vinkjes te verbergen. En vond de enumerate functie. Dus als iemand anders iets soortgelijks zoekt, kun je het zo doen.

for index, label in enumerate(ax.xaxis.get_ticklabels()):
    if index % n != 0:
        label.set_visible(False)

Antwoord 4, autoriteit 6%

Ik gebruik het volgende om elk 7e x label weer te geven:

plt.scatter(x, y)
ax = plt.gca()
temp = ax.xaxis.get_ticklabels()
temp = list(set(temp) - set(temp[::7]))
for label in temp:
    label.set_visible(False)
plt.show()

Het is behoorlijk flexibel, omdat je kunt doen wat je wilt in plaats van plt.scatter. Ik hoop dat het helpt.

Other episodes