Diagramm nach DIN 461

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
Tiiz
User
Beiträge: 13
Registriert: Mittwoch 17. September 2014, 13:30

Hallo zusammen,

ich möchte für meine Diplomarbeit nun einige Diagramme erstellen. Diese sollen möglichst noch DIN 461 aussehen. Dafür möchte ich nun die Pfeile, welche bei mir als longrightarrow im Text stehen, so wie in der DIN ans Diagramm anfügen.

Hier mein Code für das Diagramm:

Code: Alles auswählen

import matplotlib.pyplot as plt

x = [-1, 0, 1]
i = [-4, -2, 0, 2, 4]
f = [[-3, -1, 1, 3, 5],[-4, -2, 0, 2, 4],[-5, -3, -1, 1, 3]]

fig = plt.figure()                    # neue Figur
ax1 = fig.add_subplot(1, 1, 1)  # neuer Subplot
for k in xrange(len(x)):
        ax1.plot(i, f[len(x)-1-k], marker='o', label="$x=%s\/mm$"%(1000*x[len(x)-1-k]))
        
ax1.grid(which='major', axis='x', linewidth=0.75, linestyle='-', color='0.75')
ax1.grid(which='major', axis='y', linewidth=0.75, linestyle='-', color='0.75')
ax1.set_xlabel("Steuerstrom $i_x$ in A $\longrightarrow$")
ax1.set_ylabel('Kraft $f_x$\nin N $\longrightarrow$', rotation="horizontal")
ax1.legend(loc='best')
ax1.set_xlim(round(1.1*i[0]), round(1.1*i[-1]))
plt.xticks(np.arange(i[0], i[-1]+2,2))
Kann mir vielleicht jemand bei diesem Problem behilflich sein?

Viele Grüße,
Tiiz
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Wie wäre es damit:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
 
x = np.array([-1, 0, 1])
i = np.array([-4, -2, 0, 2, 4])
f = np.array([[-3, -1, 1, 3, 5],[-4, -2, 0, 2, 4],[-5, -3, -1, 1, 3]])
 
i_min = round(1.1*i.min())
i_max = round(1.1*i.max())
i_width = i_max-i_min
       
f_min = round(1.1*f.min())
f_max = round(1.1*f.max())
f_width = f_max-f_min
       
fig = plt.figure()   
ax1 = fig.add_subplot(1, 1, 1)  # neuer Subplot
for k in range(len(x)-1,-1,-1):
        ax1.plot(i, f[k], marker='o', label=r"$x=%s\/mm$"%(1000*x[k]))
        
ax1.grid(which='major', axis='x', linewidth=0.75, linestyle='-', color='0.75')
ax1.grid(which='major', axis='y', linewidth=0.75, linestyle='-', color='0.75')
ax1.set_xlabel("Steuerstrom $i_x$ in A")
ax1.set_ylabel('Kraft $f_x$\nin N', rotation="horizontal")
ax1.legend(loc='best')
ax1.set_xlim(i_min, i_max)
ax1.set_ylim(f_min, f_max)
plt.xticks(np.arange(i[0], i[-1]+2,2))

ax1.text(i_min+.65*i_width, f_min-.09*f_width, r"$\longrightarrow$", size=28)
ax1.text(i_min-.09*i_width, f_min+.7 *f_width, r"$\longrightarrow$", size=28, rotation=90)

plt.show()
In den Zeilen 18 und 19 kannst Du übrigens sehen wie Du in Python rückwärts zählen kannst.
Wenn der Backslash in einem String für LaTeX Kommandos genutzt wird, dann solltest Du den String als "raw" schreiben:

Code: Alles auswählen

theta = r"$\theta$
das würde nämlich zu Tabulator + "heta" werden:

Code: Alles auswählen

theta = "$\theta$
a fool with a tool is still a fool, www.magben.de, YouTube
Tiiz
User
Beiträge: 13
Registriert: Mittwoch 17. September 2014, 13:30

Ich danke dir MagBen, genau so hatte ich mir das vorgestellt und danke für deine Hinweise, ich werde sie in Zukunft beachten.

Wenn ich wieder ein Problem habe, melde ich mich. :wink:

Grüße,
Tiiz
Tiiz
User
Beiträge: 13
Registriert: Mittwoch 17. September 2014, 13:30

So nun habe ich wieder ein Problem.

Ich möchte nun ein qualitatives Diagramm anfertigen. Dafür benötige ich die Pfeile genau an den Achsenenden. Bietet die Achse selbst eine Möglichkeit eine Pfeil anzufügen oder muss man da wieder etwas tricksen?

Grüße,
Tiiz
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Man muss tricksen, hier sind zwei verschiedene Lösungen:
http://3diagramsperpage.wordpress.com/2 ... matplotlib (schöne Pfeile, komplexer Code)
http://matplotlib.org/examples/axes_gri ... style.html (häßliche Pfeile, einfacher Code)
a fool with a tool is still a fool, www.magben.de, YouTube
Tiiz
User
Beiträge: 13
Registriert: Mittwoch 17. September 2014, 13:30

Ich danke dir MagBen, so hatte ich mir das auch in etwa gedacht.
Da besteht nur das Problem, das mein Graph im ersten Quadranten ist und ich somit die orginalen Achsen habe. Wenn ich auf eine Achse einen Pfeil lege, dann wird immer eine Hälfte vom Pfeilkopf nicht mit angezeigt, da dieser sich außerhalb vom Diagramm befindet. Da bleibt mir nur noch die Möglichkeit alles mit einem Offset zu versehen und neue Achsen einzufügen, oder sieht da noch jemand eine andere Möglichkeit.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Schau Dir das mal an:
http://trac.sagemath.org/ticket/10740
(es ist aber kein Bild dabei, nur Code)
a fool with a tool is still a fool, www.magben.de, YouTube
Tiiz
User
Beiträge: 13
Registriert: Mittwoch 17. September 2014, 13:30

Super MagBen, genau so hab ich mir das vorgestellt. Das passe ich noch für mich an und dann sieht das bestimmt super aus. :D

Also dann bis zu meiner nächsten Diagrammfrage.

Grüße,
Tiiz
Tiiz
User
Beiträge: 13
Registriert: Mittwoch 17. September 2014, 13:30

So ich hab wieder ein kleines Problemchen.

Wenn ich mit meinem Code das Diagramm erstelle, dann ist die Achsenbeschriftung der x-Achse durch die Brüche nicht in einer Linie. Was kann man dagegen machen?

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
from math import pi

f1 = np.array(range(0, 200, 10))
f2 = np.array(range(200, 0, -10))
f1[np.where(f1>100)]=100
f2[np.where(f2>100)]=100
fges = (f1**2 + f2**2)**0.5
fges = np.append(fges, [fges, fges, fges])

x=np.array(np.arange(0, 2*pi, 2*pi/np.shape(fges)[0]))

x_min = 0
x_max = round(1.1*x.max(), 1)
x_width = x_max-x_min
f_min = 0
f_max = round(1.1*fges.max(), 1)
f_width = f_max-f_min


ax1 = plt.subplot(111)  # neuer Subplot


al = 7 # arrow length in points
arrowprops=dict(clip_on=False, # plotting outside axes on purpose
      frac=1., # make end arrowhead the whole size of arrow
      headwidth=al, # in points
      facecolor='k')
kwargs = dict(xycoords='axes fraction', textcoords='offset points', arrowprops= arrowprops,)
  
ax1.annotate("",(1,0),xytext=(-al,0), **kwargs) # bottom spine arrow
ax1.annotate("",(0,1),xytext=(0,-al), **kwargs) # left spin arrow

ax1.plot(x, fges)#, marker="o", linewidth=2)

ax1.spines["right"].set_visible(False)
ax1.spines["top"].set_visible(False)
ax1.xaxis.set_ticks_position("bottom")

plt.figtext(0.9, 0.05, "Umfang")
plt.figtext(0.07, 0.87, "$f_\mathrm{Lmax}$")

ax1.set_xlim(x_min, x_max)
ax1.set_ylim(f_min, f_max)

ax1.set_xticks((0,0.5*pi, pi, 1.5*pi,2*pi))
ax1.set_xticklabels((r""+"\nPol a",r"$\frac{1}{2}\pi$"+"\nPol b", r"$\pi$"+"\nPol c",r"$\frac{3}{2}\pi$"+"\nPol d", r"$2\pi$"+"\nPol a"))

ax1.set_yticks([])
Schöne Grüße,
Tiiz
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

In LaTeX würde man das mit \vphantom machen, aber \vphantom scheint nicht von Matplotlib unterstützt zu werden.
a fool with a tool is still a fool, www.magben.de, YouTube
Tiiz
User
Beiträge: 13
Registriert: Mittwoch 17. September 2014, 13:30

Mhh, und kann man den Abstand der einzelnen Labels einzeln einstellen? Das ist zwar nicht besonders schöner Code, aber das Diagramm würde gut aussehen. :D
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Wenn Du die Achsenbeschriftung (0, 1/2 pi, ...) und die Beschreibung der Kurve (Pol a, Pol b, ...) trennen würdest, dann würde es besser aussehen. Das hier sieht für die Achsenbeschriftung OK aus:

Code: Alles auswählen

ax1.set_xticklabels((r"$0$",
                     r"$\frac{1}{2}\pi$", 
                     r"$1\pi$",
                     r"$\frac{3}{2}\pi$", 
                     r"$2\pi$"))
und die Pole würde ich mit Annotations markieren: http://matplotlib.org/examples/pylab_ex ... _demo.html
a fool with a tool is still a fool, www.magben.de, YouTube
Tiiz
User
Beiträge: 13
Registriert: Mittwoch 17. September 2014, 13:30

Ich habe es jetzt so gemacht:

Code: Alles auswählen

ax1.set_xticklabels((r"$0$",r"$\frac{1}{2}\pi$", r"$\pi$",r"$\frac{3}{2}\pi$", r"$2\pi$"))

ax1.text(x_min-.025*x_width, f_min-.1*f_width, r"Pol a")
ax1.text(x_min+.205*x_width, f_min-.1*f_width, r"Pol b")
ax1.text(x_min+.44*x_width, f_min-.1*f_width, r"Pol c")
ax1.text(x_min+.67*x_width, f_min-.1*f_width, r"Pol d")
ax1.text(x_min+.90*x_width, f_min-.1*f_width, r"Pol a")
Ich danke dir abermals für deien Anregungen und Idee und natürlich auch für deine Mühen.

Bis später,
Tiiz
Antworten