2017-08-01 1 views
1

Es gab andere Fragen darüber, aber keine scheint meine genaue Frage zu decken/keiner ihrer Lösungen "korrigierte" mein Problem.Matplotlib twinx-Ausrichtung mit yticklabels und yticks

import matplotlib.pyplot as plt 
calendar = [[1,0,0,1,1,0,1],[0,0,1,1,1,0,1]] 
fig, ax = plt.subplots() 
namelist = ['alpha','beta'] 
yticks = [n for n in range(len(namelist))] 
ax.set_yticks(yticks) 
ax.set_yticklabels(namelist) 
ax2 = ax.twinx() 
ax2.set_yticks(ax.get_yticks()) 
ax2.set_yticklabels(['gamma','delta'])  

im = ax.imshow(calendar, interpolation='none', cmap='summer') 
plt.show() 

enter image description here

Natürlich ist die obere ist nur eine sehr vereinfachte Version, aber es sollte genug sein, um das Problem zu sehen: Wenn die beiden „ax2 Zeilen“ Auskommen die Handlung ist, wie ich will, aber beim Hinzufügen auf der zweiten Y-Achse ändert sich der Plot wie ich es nicht möchte. Ich möchte, dass das Alpha/Beta auf der gleichen Höhe wie Gamma/Delta ist (so dass kein Leerraum übrig bleibt), aber ich versage seit geraumer Zeit. Ich habe versucht, die get_yticks() Funktion (wie in einigen ähnlichen Fragen vorgeschlagen), aber es hat nicht geholfen. Vielen Dank im Voraus!

EDIT: Ein kleines Detail: Die Lösung sollte "erweiterbar" in dem Sinne sein, dass sie mehr Y-Werte (Alpha, Beta, Delta, ...) mit ihrem Zwillings-Gegenstück vor sich hat.

EDIT 2: (Ich war mir nicht sicher, ob das Posten einer neuen Frage nützlich war, also frage ich einfach hier :) Ich versuche jetzt ein Gitter hinzuzufügen. Ich habe wieder viel probiert, aber nichts scheint mir zu helfen, bestenfalls bekomme ich ein Y-Achsen-Raster. Überprüfen Sie den folgenden Code (und versuchen, das gleiche mit diesen Zeilen unkommentiert!):

import matplotlib.pyplot as plt 
calendar = [[1,0,0,1,1,0,1],[0,0,1,1,1,0,1]] 
fig, ax = plt.subplots() 
namelist = ['alpha','beta'] 
yticks = [n for n in range(len(namelist))] 
ax.set_xticks([num for num in range(len(calendar[0]))]) 
ax.set_xticks([num-0.5 for num in range(len(calendar[0]))],minor=True) 
ax.set_yticks(yticks) 
ax.set_yticks([num-0.5 for num in range(len(namelist))],minor=True) 
ax.set_yticklabels(namelist) 
im = ax.imshow(calendar, interpolation='none', cmap='summer') 
ax.set_adjustable('box-forced') 
ax.xaxis.grid(which='major',alpha=1,color='k',lw=2) 
ax.xaxis.grid(which='minor',alpha=1,color='k',lw=2) 
ax.yaxis.grid(which='minor',alpha=1,color='k',lw=2) 

#ax2 = ax.twinx() 
#ax2.set_yticks(ax.get_yticks()) 
#ax2.set_yticklabels(['gamma','delta'])  
#im2 = ax2.imshow(calendar, interpolation='none', cmap='summer') 
#ax2.set_adjustable('box-forced') 

plt.show() 

Wie kann ich das Gitter bekommen zu zeigen? Hier ein Bild davon wie es ist (ohne ax2). Grundsätzlich sollte mir der Code nicht genau das selbe geben, aber mit dem/den zweiten Label (s) rechts ?! enter image description here

Antwort

2

Ein Weg, was Sie wollen ist wieder Grundstück auf ax2:

im2 = ax2.imshow(calendar, interpolation='none', cmap='summer') 

Es ist nicht perfekt, aber es funktioniert.

ticks in correct positions

EDIT:

Im Anschluss an die Antwort here, wenn Sie weiteren set_adjustable auf Ihren Achsen verwenden, die Leerzeichen verschwinden:

import matplotlib.pyplot as plt 
calendar = [[1,0,0,1,1,0,1],[0,0,1,1,1,0,1]] 
fig, ax = plt.subplots() 
namelist = ['alpha','beta'] 
yticks = [n for n in range(len(namelist))] 
ax.set_yticks(yticks) 
ax.set_yticklabels(namelist) 
im = ax.imshow(calendar, interpolation='none', cmap='summer') 
ax.set_adjustable('box-forced') 

ax2 = ax.twinx() 
ax2.set_yticks(ax.get_yticks()) 
ax2.set_yticklabels(['gamma','delta'])  
im2 = ax2.imshow(calendar, interpolation='none', cmap='summer') 
ax2.set_adjustable('box-forced') 

plt.show() 

whitespace removed

+0

Danke, das half Ich schon, aber es löst immer noch nicht das Problem des Leerraumes über und unter dem grün/gelben Teil. – famfop

+0

@famfop Oh, ich sehe, gib mir eine Minute ... –

+0

Danke! Große Antwort: kurz und auf dem Punkt! – famfop

Verwandte Themen