2015-08-24 14 views
8

modo migliore per descrivere quello che voglio ottenere è utilizzando la mia immagine:Pausa // in x asse del matplotlib

enter image description here

Ora ho un sacco di spazio morto nella trama spettri, in particolare tra 5200 e 6300. la mia domanda è molto semplice, come vorrei aggiungere in una piacevole pausa po // che sembra qualcosa di simile a questo (immagine sollevato dalla rete):

enter image description here

sto usando questa configurazione per i miei lotti:

nullfmt = pyplot.NullFormatter() 

fig = pyplot.figure(figsize=(16,6)) 

gridspec_layout1= gridspec.GridSpec(2,1) 
gridspec_layout1.update(left=0.05, right=0.97, hspace=0, wspace=0.018) 
pyplot_top  = fig.add_subplot(gridspec_layout1[0]) 
pyplot_bottom = fig.add_subplot(gridspec_layout1[1]) 

pyplot_top.xaxis.set_major_formatter(nullfmt) 

Sono abbastanza certo è realizzabile con gridpsec ma una copertura tutorial avanzato esattamente come questo è realizzato sarebbe molto apprezzato.

Ci scusiamo anche se questa domanda è stata trattata in precedenza su StackOverflow ma ho cercato estesamente la procedura corretta per gridSpec ma non ho trovato ancora nulla.

sono riuscito ad andare fino a questo, praticamente non vi:

enter image description here

Tuttavia, le mie linee di interruzione non sono così ripide come io li vorrei ... come faccio a cambiare loro? (Ho fatto uso dell'esempio risposta qui sotto)

+1

È questo [esempio] (http://matplotlib.org/examples/pylab_examples/broken_axis.html) utile? –

risposta

10

Si potrebbe adattare the matplotlib example per una pausa in asse x direttamente:

""" 
Broken axis example, where the x-axis will have a portion cut out. 
""" 
import matplotlib.pylab as plt 
import numpy as np 


x = np.linspace(0,10,100) 
x[75:] = np.linspace(40,42.5,25) 

y = np.sin(x) 

f,(ax,ax2) = plt.subplots(1,2,sharey=True, facecolor='w') 

# plot the same data on both axes 
ax.plot(x, y) 
ax2.plot(x, y) 

ax.set_xlim(0,7.5) 
ax2.set_xlim(40,42.5) 

# hide the spines between ax and ax2 
ax.spines['right'].set_visible(False) 
ax2.spines['left'].set_visible(False) 
ax.yaxis.tick_left() 
ax.tick_params(labelright='off') 
ax2.yaxis.tick_right() 

# This looks pretty good, and was fairly painless, but you can get that 
# cut-out diagonal lines look with just a bit more work. The important 
# thing to know here is that in axes coordinates, which are always 
# between 0-1, spine endpoints are at these locations (0,0), (0,1), 
# (1,0), and (1,1). Thus, we just need to put the diagonals in the 
# appropriate corners of each of our axes, and so long as we use the 
# right transform and disable clipping. 

d = .015 # how big to make the diagonal lines in axes coordinates 
# arguments to pass plot, just so we don't keep repeating them 
kwargs = dict(transform=ax.transAxes, color='k', clip_on=False) 
ax.plot((1-d,1+d), (-d,+d), **kwargs) 
ax.plot((1-d,1+d),(1-d,1+d), **kwargs) 

kwargs.update(transform=ax2.transAxes) # switch to the bottom axes 
ax2.plot((-d,+d), (1-d,1+d), **kwargs) 
ax2.plot((-d,+d), (-d,+d), **kwargs) 

# What's cool about this is that now if we vary the distance between 
# ax and ax2 via f.subplots_adjust(hspace=...) or plt.subplot_tool(), 
# the diagonal lines will move accordingly, and stay right at the tips 
# of the spines they are 'breaking' 

plt.show() 

matplotlib broken x-axis example

Per i vostri scopi, basta tracciare i dati due volte (una volta su ciascun asse, ax e ax2 e impostare correttamente il valore xlim. Le "linee di interruzione" dovrebbero spostarsi per corrispondere alla nuova interruzione perché sono tracciate in coordinate dell'asse relativo anziché in coordinate di dati.

Le linee di interruzione sono linee di tracciamento appena srotolate tracciate tra una coppia di punti. Per esempio. ax.plot((1-d,1+d), (-d,+d), **kwargs) traccia la linea di separazione tra il punto (1-d,-d) e (1+d,+d) sul primo asse: questo è quello in basso a destra. Se si desidera modificare il graident, modificare questi valori in modo appropriato. Ad esempio, per rendere questo più ripido, prova ax.plot((1-d/2,1+d/2), (-d,+d), **kwargs)

+0

Aggiungerò quello che ho finora, ma le mie linee di interruzione non sono belle come il tuo esempio, come modifico il loro "gradiente"? –

+0

Vedere la mia domanda aggiornata. –

+1

Le linee di interruzione sono linee di stampa non tagliate: vedi la mia modifica. – xnx

5

La soluzione fornita da xnx è un buon inizio, ma c'è un problema che le scale degli assi x sono diverse tra i grafici. Questo non è un problema se l'intervallo nel grafico di sinistra e l'intervallo nel grafico di destra sono gli stessi, ma se sono disuguali, il sottotramma darà comunque ai due grafici uguale larghezza, quindi la scala dell'asse x sarà diversa tra due grafici (come nel caso dell'esempio di xnx). Ho creato un pacchetto, brokenaxes per far fronte a questo.

+1

Grazie! Ha funzionato perfettamente – arie64

Problemi correlati