2017-02-02 4 views
4

Dies ist ein einfacher Code, der die Art von Graph i`m versuchen zu zeichnen reproduziert:Matplotlib: Gitterlinien über Stäbe

import matplotlib.pyplot as plt 
import seaborn as sb 
import numpy as np 

x = np.arange(1,11) 
y1 = x[::-1] 
y2 = 2 ** x 

fig = plt.figure(figsize = (8,6)) 
ax1 = fig.add_subplot(111) 
plt.bar(x, y1, 1, color = 'blue') 
ax1.grid(axis = 'y') 
ax2 = ax1.twinx() 
ax2.plot(x+0.5, y2, color = 'red') 

Welche produziert:

enter image description here

Die Rasterlinien aus Das letzte Liniendiagramm erscheint über den Balken. Wie kann ich sie hinter die Gitter setzen?

+0

Von [diesem] (http://stackoverflow.com/questions/1726391/matplotlib-draw-grid-lines-behind-other-graph-elements) scheint es, dass Sie 'set_axisbelow (True)' mit dem verwenden möchten Dokumentation [hier] (http://matplotlib.org/api/axes_api.html). Ich scheine gerade einen schrecklichen Job dabei zu haben, es zu implementieren, also kommst du vielleicht vor mir hin. – roganjosh

+0

Ich verstehe das wirklich nicht. Soweit ich feststellen kann, dass ich die gesamte Dokumentation und die Beispiele richtig befolge, bekomme ich keinen Fehler, aber es wird einfach komplett ignoriert. Ich bin mir nicht sicher, ob ich das Problem lösen kann. – roganjosh

Antwort

0
import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(1,11) 
y1 = x[::-1] 
y2 = 2 ** x 

fig = plt.figure(figsize = (8,6)) 
ax1 = fig.add_subplot(111) 
ax2 = ax1.twinx() 

# from back to front 
ax1.grid(axis="both", color="black") 
ax1.bar(x, y1, 1, alpha=.9, edgecolor="black", facecolor='blue', zorder=1) 

ax2.grid(axis="y", color="green") 
#ax2.grid(False) 
ax2.plot(x+0.5, y2, color='red') 

plt.show() 

die die folgenden Graphen erstellen, die die Zorder der Elemente veranschaulichen.

ax1.grid => ax1.bar => ax2.grid => ax2.line

zorder of elements in plot

die einzige Abhilfe, die ich denken kann, ist das Gitter in ax1 plotten und ax2 Gitter auszuschalten (wenn Sie wirklich die horizontale Gitterlinie für ax2 wollen plotten, dann könnten Sie die Zeile mit ax1 plotten müssen.

ax1.grid(True, axis="both", color="yellow") 
ax1.bar(x, y1, 1, alpha=.9, edgecolor="black", facecolor='blue', zorder=1) 

ax2.grid(False) 
ax2.plot(x+0.5, y2, color='red') 

some workaround

+0

Danke, das bietet eine bessere Visualisierung. In der Tat verwende ich einen ähnlichen Ansatz, da ich diese Zeile "ax1.grid (axis = 'y')" entfernt und "ax2.grid (False)" am Ende hinzugefügt habe. Es ist jedoch nicht genau das, wonach ich gesucht habe (ich möchte die horizontalen Gitterlinien nur für die rechte Achse, ax2). Von [diesem] (http: // stackoverflow.com/a/29542999/4862402), fand ich heraus, dass es möglich ist, die rechten und linken Teilstrichmarkierungen auszurichten, aber es kann zu hässlichen Beschriftungen auf der rechten Achse führen (floats nicht gerundet), was in meiner realen Situation passiert ist. –

0

nach einige Suchen und Versuche, die Lösung, die ich gefunden habe, zu teilen, damit andere sie als Referenz in Zukunft verwenden können. Dies ist nicht genau das, was ich gesucht habe, da ich horizontale Gitterlinien nur für die rechte Achse haben möchte, jedoch bot es eine viel bessere Visualisierung als das ursprüngliche Diagramm.

Von this, ich fand heraus, wie die linken und rechten Achsen Ticks (dieses Problem passiert auch mit Liniendiagramme, aber der Effekt ist nicht so störend wie in einem Balkendiagramm).

import matplotlib.pyplot as plt 
import seaborn as sb 
import numpy as np 

x = np.arange(1,11) 
y1 = x[::-1] 
y2 = 2 ** x 

fig = plt.figure(figsize = (8,6)) 
ax1 = fig.add_subplot(111) 
plt.bar(x, y1, 1, color = 'blue') 
ax2 = ax1.twinx() 
ax2.plot(x+0.5, y2, color = 'red') 
ax2.set_yticks(np.linspace(ax2.get_yticks()[0],ax2.get_yticks()[-1],len(ax1.get_yticks()))) 

enter image description here

Die Gitterlinien sind noch über den Balken. Da die Teilstriche jedoch ausgerichtet sind, können wir nun das Gitter des zweiten Liniendiagramms entfernen, indem wir den expliziten Befehl: ax2.grid(False) am Ende des vorherigen Codes hinzufügen.

enter image description here

Wichtig: Beachten Sie, dass in diesem Beispiel die Etiketten in der linken und rechten Achse ziemlich nett sind. In einer realen Situation kann dieser Ansatz jedoch dazu führen, dass auf der rechten Achse hässliche Beschriftungen (Floats oder grobe Ganzzahlen) erscheinen. Mit dieser Methode können wir immer noch nicht die Position der rechten Teilstriche festlegen, daher ist es keine exakte Antwort für die Frage.

Verwandte Themen