Matplotlib und Subplotabstand - vertikal

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Mahlzeit :mrgreen:

ich stehe vor dem Problem,
dass ich 3 Subplots untereinander plotten möchte und
jedem Subplot einen Titel verpassen will.

Leider sind die Abstände so gering, dass der Titel vorn
der Achsenbeschriftung überdeckt wird.

Wie bekomme ich die weiter auseinander, so das man
den Titel lesen kann? Die Beispiele auf der Homepage
von Matplotlib konnten zur Lösung leider nicht beitragen :K

Bild

Code: Alles auswählen

def plot_schnittkraefte_vorspannung(string):
  # Plottet die Querkraft
  
  # String auspacken
  json = unpack(string)
  pv = numpy.array(json["pv"])
  ph = numpy.array(json["ph"])
  mcp = numpy.array(json["mcp"])
  x = numpy.array(json["x_plot_schnitt"])
  l1 = json["l1"]

  #Ausgabe als Plot
  #Plot  x,y
  
  s = StringIO()
  
  fig = Figure(figsize=(7,6))
  canvas = FigureCanvas(fig)
  
  ax1 = fig.add_subplot(311)
  ax1.plot(x, ph, label= "N", color = 'k')
  ax1.set_ylabel('Normalkraft [kN]', size='x-small')
  ax1.set_title('Normalkraft infolge Vorspannung', size='x-small')
  ax1.axhline(linewidth=1, color='k', linestyle='-')
  ax1.fill_between(x , 0, ph, where=ph<0, color = 'b', alpha=0.5)
  ax1.set_ylim(0,(numpy.amin(ph))*1.1) # Plot auf Traegerhoehe begrenzen
  ax1.grid()
  ax1.set_xlim(0,numpy.amax(x)) # Plot auf Traegerlenge begrenzen

  ax2 = fig.add_subplot(312)
  ax2.set_title('Querkraft infolge Vorspannung', size='x-small')
  ax2.set_ylabel('Querkraft [kN]', size='x-small')
  ax2.plot(x, pv, label= "V", color = 'k')
  ax2.axhline(linewidth=1, color='k', linestyle='-')
  ax2.axvline(x = l1, linewidth=2, color='k') # Lager
  ax2.fill_between(x, 0, pv, where=pv<=0, color = 'r', alpha=0.5)
  ax2.fill_between(x , 0, pv, where=pv>0, color = 'b', alpha=0.5)
  ax2.grid() # Gitternetz zeichnen
  ax2.set_xlim(0,numpy.amax(x)) # Plot auf Traegerlenge begrenzen
  
  ax3 = fig.add_subplot(313)
  ax3.set_ylabel('Momentenverlauf [kN]', size='x-small')
  ax3.set_xlabel('Laenge [m]', size='x-small')
  ax3.set_title('Momentenverlauf infolge Vorspannung', size='x-small')
  ax3.plot(x, mcp, label= "M", color = 'k')
  ax3.axhline(linewidth=1, color='k', linestyle='-')
  ax3.axvline(x = l1, linewidth=2, color='k') # Lager
  ax3.fill_between(x, 0, mcp, where=mcp>=0, color = 'r', alpha=0.5)
  ax3.fill_between(x , 0, mcp, where=mcp<0, color = 'b', alpha=0.5)
  ax3.grid() # Gitternetz zeichnen
  ax3.set_xlim(0,numpy.amax(x)) # Plot auf Traegerlenge begrenzen
  ax3.set_ylim(numpy.amax(mcp),numpy.amin(mcp)) # Plot auf Traegerhoehe begrenzen
  ax3.set_xlabel('Laenge [m]', size='x-small')
    
  canvas.print_figure(s, format='png')
  return s.getvalue()
Gruß
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

subplot_adjust sollte bei den Abständen zwischen den subplots weiterhelfen.

Noch eine oberlehererhafte Bemerkung :-)

Die Angabe der Einheiten (typographisch) bei dir ist veraltet, besser ist: 'Querkraft / kN' oder 'Querkraft in kN'

Grüße
mushroom
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Vielen dank,

es funktioniert in dem man noch SubplotParms importiert

und dann im Plot diese rein schreibt

Code: Alles auswählen

fig = Figure(figsize=(7,6.5), subplotpars=SubplotParams(left=None, bottom=None, right=None, top=None, wspace=None, hspace=0.4))
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@mathman: Alternativ kann man auch mit "Figure.add_axes(...)" die einzelnen "Axes" manuell setzen.

@mushroom: Einheiten in eckige Klammern zu setzen, ist manchmal ungern gesehen, weil "[Kraft] = 1 Newton" eigentlich bedeutet, dass die Einheit der Kraft "1 Newton" ist. Der Ausdruck "Kraft [Newton]" ist mit dieser Definition im Hinterkopf dann etwas seltsam. Ich habe mal durch einige Paper geblättert, und hier und da findet man durchaus Einheiten in eckigen Klammern. Sehr viel häufiger werden aber runde Klammern verwendet; also "Kraft (Newton)".

Meiner Meinung ist es doch völlig egal, wie man die Einheiten hinschreibt. Wichtig ist das immer sofort klar ist, was hier gemeint ist. Viel schlimmer ist es, wenn Diagramme unzureichend beschriftet sind, und man raten muss, was hier eigentlich abgebildet ist. Aus dem Titel "Querkraft infolge Vorspannung" kann ich, ohne Hintergrundwissen, nicht verstehen, was dort abgebildet sein soll.

Grüße
Gerrit
Antworten