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