Sto usando GridSpec per tracciare due lotti uno sotto l'altro senza un divario tra conmatplotlib prune tick etichette
gs = gridspec.GridSpec(3, 1)
gs.update(hspace=0., wspace=0.)
ax1 = plt.subplot(gs[0:2, 0])
ax2 = plt.subplot(gs[2, 0], sharex=ax1)
che funziona bene. Tuttavia, voglio eliminare l'etichetta di spunta superiore e inferiore di ciascuna sottotrama. Per che uso
nbins = len(ax1.get_yticklabels())
ax1.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='both'))
nbins = len(ax2.get_yticklabels())
ax2.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='both'))
che in molti casi funziona bene. In alcuni grafici, tuttavia, una o più delle 4 etichette da potare sono ancora presenti. Ho guardato ad es. ax1.get_ylim()
e si è notato che invece di ad esempio il limite superiore è 10
(come è mostrato nella trama stessa), in realtà è 10.000000000000002
, che sospetto sia il motivo per cui non viene potato. Come succede e come posso liberarmene?
Ecco un esempio: Si noti che nella figura l'asse y è invertito e nessuna etichetta viene tagliata, tuttavia dovrebbe essere. Si noti inoltre che per qualche motivo l'etichetta y più bassa è impostata su una posizione negativa, che non vedo. Le posizioni delle tacche y sono mostrate nelle coordinate dell'asse nel testo all'interno dei grafici. Nell'immagine qui sotto, l'etichetta a 10.6 non dovrebbe essere lì!
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from matplotlib.ticker import MaxNLocator
import numpy as np
x1 = 1
y1 = 10.53839
err1 = 0.00865
x2 = 2
y2 = 9.43045
err2 = 0.00658
plt.clf()
fig = plt.figure(figsize=(6, 6))
gs = gridspec.GridSpec(3, 1)
gs.update(hspace=0., wspace=0.)
ax1 = plt.subplot(gs[0:2, 0])
ax1.errorbar(x1, y1, yerr=err1)
ax1.errorbar(x2, y2, yerr=err2)
ax1.invert_yaxis()
plt.setp(ax1.get_xticklabels(), visible=False) # Remove x-labels between the plots
plt.xlim(0, 3)
ax2 = plt.subplot(gs[2, 0], sharex=ax1)
nbins = len(ax1.get_yticklabels())
ax1.yaxis.set_major_locator(MaxNLocator(nbins=8, prune='both'))
nbins = len(ax2.get_yticklabels())
ax2.yaxis.set_major_locator(MaxNLocator(nbins=6, prune='both'))
plt.savefig('prune.png')
plt.close()
Dalla tua domanda, suona come si desidera avere lo stesso asse x, e quindi non etichette delle tacche a tutti fro che uno, coperto in risposta qui sotto, e poi si desidera solo per potare inferiore e superiore , per i grafici superiore e inferiore, rispettivamente. È un'interpretazione accurata? – will
Esattamente, l'asse x va bene. Voglio impostare il numero di ticks y (nell'esempio sopra 'nbins',) e da quello voglio eliminare il valore superiore e inferiore, se è localizzato all'estremità (inferiore o superiore) dell'asse. – frixhax
Non riesco a riprodurre l'errore. Con il codice che hai fornito (inclusa la riga nella mia risposta di seguito), tutto funziona come dovrebbe per me. Potresti fornire un esempio che mostri il problema? – hitzg