2015-01-12 14 views
6

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

prune

+1

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

+0

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

+0

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

risposta

2

Potrebbe essere, che si sta guardando più sull'etichetta sinistra sull'asse x della trama superiore? Se è così, questo dovrebbe fare il trucco:

ax1.set_xticklabels([]) 

EDIT: Se si utilizza sharex, è necessario utilizzare questo, altrimenti le etichette delle tacche vengono rimossi su entrambi gli assi.

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

No, non uso nessuna etichetta x tra i due grafici, quindi 'hspace = 0 '. Ciò che la potatura dovrebbe fare è sfoltire l'etichetta di spunta più alta e più bassa, se si trova alle due estremità dello y- asse. Ma in molti casi non lo fa. – frixhax

+0

Dal tuo codice non era chiaro, che hai già rimosso le etichette del segno di spunta x. – hitzg

+0

Sì, capisco, mi dispiace per quello. Tuttavia, per il problema di potatura l'asse x non è importante. – frixhax