2015-01-12 17 views
6

ich GridSpec bin mit zwei Plots plotten untereinander ohne Lücke dazwischen mitmatplotlib Prune tick-Etiketten

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) 

der gut arbeitet. Ich möchte jedoch die obere und untere Teilbeschriftung jedes Unterplotters loswerden. Dafür verwende ich

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

die in vielen Fällen funktioniert gut. In einigen Plots sind jedoch immer noch eine oder mehrere der zu beschneidenden Etiketten vorhanden. Ich schaute z. ax1.get_ylim() und bemerkte, dass zum Beispiel die obere Grenze 10 ist (wie es in der Handlung selbst gezeigt wird), ist es tatsächlich 10.000000000000002, die ich vermute, ist der Grund, warum es nicht beschnitten wird. Wie passiert das und wie kann ich das loswerden?

Hier ist ein Beispiel: Beachten Sie, dass in der Abbildung die y-Achse invertiert ist und keine Beschriftung beschnitten wird, obwohl es sein sollte. Beachten Sie auch, dass aus irgendeinem Grund das niedrigste y-Label auf eine negative Position gesetzt ist, die ich nicht sehe. Die Y-Tick-Positionen werden in Achsenkoordinaten im Text innerhalb der Diagramme angezeigt. Im Bild unten sollte das Etikett bei 10.6 nicht da sein!

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

Aus Ihrer Frage, es klingt wie Sie die gleiche x-Achse haben wollen, und so keine Zecke Etiketten überhaupt her, dass man, unten in der Antwort bedeckt, und dann wollen Sie nur beschneiden unteren und oberen , für die oberen bzw. unteren Graphen. Ist das eine genaue Interpretation? – will

+0

Genau, die x-Achse ist in Ordnung. Ich möchte die Anzahl der y-Ticks einstellen (im obigen Beispiel 'nbins') und daraus den oberen und unteren Wert löschen, wenn er am (unteren oder oberen) Ende der Achse liegt. – frixhax

+0

Ich kann den Fehler nicht reproduzieren. Mit dem Code, den Sie angegeben haben (einschließlich der Zeile in meiner Antwort unten), funktioniert alles so, wie es für mich sein sollte. Können Sie ein Beispiel angeben, das das Problem zeigt? – hitzg

Antwort

2

Könnte es sein, dass Sie sich auf der x-Achse des oberen Grundstück am äußersten linken Label suchen? Wenn ja, sollte dies den Trick:

ax1.set_xticklabels([]) 

EDIT: Wenn Sie sharex verwenden, müssen Sie diese verwenden, da sonst die Strichbeschriftungen auf beiden Achsen entfernt werden.

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

Nein, ich verwende keine x-Beschriftungen zwischen den beiden Plots, daher 'hspace = 0.' was prune tun soll, ist die oberste und unterste Tick-Marke zu beschneiden, wenn sie sich an einem Ende des y- Achse. Aber in vielen Fällen macht es das nicht. – frixhax

+0

Aus Ihrem Code war nicht ersichtlich, dass Sie bereits die x-Tick-Labels entfernt haben. – hitzg

+0

Ja, ich verstehe, tut mir leid. Für das Beschneidungs-Problem ist die x-Achse jedoch unwichtig. – frixhax