Seite 1 von 1
Diagramm nach DIN 461
Verfasst: Donnerstag 23. Oktober 2014, 15:27
von Tiiz
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
Re: Diagramm nach DIN 461
Verfasst: Freitag 24. Oktober 2014, 12:43
von MagBen
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:
das würde nämlich zu Tabulator + "heta" werden:
Re: Diagramm nach DIN 461
Verfasst: Montag 27. Oktober 2014, 09:28
von Tiiz
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.
Grüße,
Tiiz
Re: Diagramm nach DIN 461
Verfasst: Montag 10. November 2014, 13:36
von Tiiz
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
Re: Diagramm nach DIN 461
Verfasst: Montag 10. November 2014, 16:18
von MagBen
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)
Re: Diagramm nach DIN 461
Verfasst: Montag 10. November 2014, 16:30
von Tiiz
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.
Re: Diagramm nach DIN 461
Verfasst: Dienstag 11. November 2014, 06:42
von MagBen
Schau Dir das mal an:
http://trac.sagemath.org/ticket/10740
(es ist aber kein Bild dabei, nur Code)
Re: Diagramm nach DIN 461
Verfasst: Dienstag 11. November 2014, 09:55
von Tiiz
Super MagBen, genau so hab ich mir das vorgestellt. Das passe ich noch für mich an und dann sieht das bestimmt super aus.
Also dann bis zu meiner nächsten Diagrammfrage.
Grüße,
Tiiz
Re: Diagramm nach DIN 461
Verfasst: Dienstag 11. November 2014, 13:56
von Tiiz
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
Re: Diagramm nach DIN 461
Verfasst: Dienstag 11. November 2014, 17:41
von MagBen
In LaTeX würde man das mit \vphantom machen, aber \vphantom scheint nicht von Matplotlib unterstützt zu werden.
Re: Diagramm nach DIN 461
Verfasst: Mittwoch 12. November 2014, 10:19
von Tiiz
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.

Re: Diagramm nach DIN 461
Verfasst: Mittwoch 12. November 2014, 11:18
von MagBen
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
Re: Diagramm nach DIN 461
Verfasst: Mittwoch 12. November 2014, 13:08
von Tiiz
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