Seite 1 von 1
Diagramm DIN matplotlib
Verfasst: Sonntag 29. Juni 2014, 15:22
von dl6tud
Ich würde gern Diagramme nach DIN 461 erstellen (
http://de.wikipedia.org/wiki/DIN_461). Insbesondere möchte ich die Einheit direkt an die Achse schreiben, zwischen die Zahlen, siehe auch
http://de.wikipedia.org/wiki/DIN_461#me ... itativ.svg unten. Auf "polnischem" Wege wäre mit "ax.annotate" sicher möglich, ich sucher aber eher nach einer einfacheren Möglichkeit.
Mit gnuplot geht es nicht, mit pgfplots sicher, aber python wäre der doch schnellste Weg um gute Diagramme zu erstellen. Daher die Frage.
Re: Diagramm DIN matplotlib
Verfasst: Sonntag 29. Juni 2014, 15:31
von EyDu
Hallo!
Hast du dich schon durch die
Gallery (oder die
schönere Version 
) von Matplotlib gearbeitet? Vielleicht ist da ein Ansatz für dich bei.
Re: Diagramm DIN matplotlib
Verfasst: Sonntag 29. Juni 2014, 15:57
von Darii
Das hilft zwar nicht großartig weiter, aber du kannst ruhig die Standardstile verwenden. Die orientieren sich grob daran was auch bei wissenschaftlichen Publikationen verwendet wird. Gerade Einheiten in den Zwischen den Zahlen sind unüblich. Die gehören in die Achsenbeschriftung.
Re: Diagramm DIN matplotlib
Verfasst: Sonntag 29. Juni 2014, 16:14
von MagBen
Mit Matplotlib geht in Sachen Diagrammen (fast) alles.
Wenn Du hier Hilfestellung haben möchtest, dann poste Python-Code der ein Diagramm erzeugt, das schon ungefähr Deinen Vorstellungen entspricht. Auf dieser Grundlage können hier dann Details diskutiert und probiert werden.
Re: Diagramm DIN matplotlib
Verfasst: Sonntag 29. Juni 2014, 18:56
von dl6tud
Danke für die Tipps! Die Gallery habe ich jetzt (ohne Erfolg) kontrolliert. Das Einheiten zwischen den Zahlen unüblich sind, liegt darin, dass gnuplot, matplotlib etc. das leider nicht unterstützen. Egal, ich will das so
Ich hänge mal ein Beispiel an. Das "s" und "V" müsste sozusagen an die richtige Stelle.
Code: Alles auswählen
#!/usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
import pylab
params = {'font.size' : 18, 'legend.fontsize': 20}
pylab.rcParams.update(params)
t = np.arange(0.0, 1.0 + 0.01, 0.01)
s = np.cos(4 * np.pi * t) + 2
plt.rc('text', usetex=True)
#plt.rc('font', family='serif')
plt.plot(t, s)
plt.xlabel(r'\textit{t}')
plt.ylabel(r'\textit{U}')
plt.subplots_adjust(top=0.8)
plt.annotate(r's', (0.9, 1.0), horizontalalignment='left', verticalalignment='top')
plt.annotate(r'V', (0.0, 2.75), horizontalalignment='left', verticalalignment='top')
plt.savefig('demo')
plt.show()
Re: Diagramm DIN matplotlib
Verfasst: Sonntag 29. Juni 2014, 19:52
von EyDu
Vielleicht könntest du mit "set_yticks" und "set_yticklabels" da etwas drehen, besonders sauber scheint mir das aber nicht. Vielleicht hilft auch ein genauer Blick in die Dokumentation zum
axis-Modul, da ist jede Menge einstellbar. Mit der Tick-Klasse geht vielleicht auch noch etwas.
Re: Diagramm DIN matplotlib
Verfasst: Montag 30. Juni 2014, 06:45
von MagBen
Ich habe Deine Font-Einstellungen weggelassen, die haben bei mir nicht funktioniert (Ubuntu 14.04).
Den Y-Label habe ich Horizontal gedreht, mit Leerzeichen den Abstand zur Achse vergrößert und den Font größer gemacht, sonst sieht der LaTeX Label kleiner aus als die Ticks.
Für die Einheit habe ich den Tick-Label vom letzten Tick ausgetauscht. Damit das funktioniert muss der Plot mit canvas.draw() schon gezeichnet worden sein, davor sind die Tick-Label noch nicht initialisiert.
Wichtig ist auch, dass Du den Rückgabewert von ax.get_xticklabels() nicht einfach nach ax.set_xticklabels() übergeben darfst. ax.get_xticklabels() gibt eine Liste von Tick Objekten zurück, ax.set_xticklabels() erwartet eine Liste von String Objekten, bzw. ruft einfach str() bei allen Elementen auf.
Code: Alles auswählen
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 1.0 + 0.01, 0.01)
s = np.cos(4 * np.pi * t) + 2
plt.plot(t, s)
#Der Plot muss schon gezeichnet sein, damit Du ihn veraendern kannst!
plt.gcf().canvas.draw()
plt.xlabel(r'$t$', fontsize=18)
plt.ylabel(r'$U$ ', rotation='horizontal', fontsize=18)
ax = plt.gca()
labels = [tick.get_text() for tick in ax.get_xticklabels()]
labels[-1] = 's'
ax.set_xticklabels(labels)
labels = [tick.get_text() for tick in ax.get_yticklabels()]
labels[-1] = 'V'
ax.set_yticklabels(labels)
plt.savefig('demo.png')
plt.show()
Re: Diagramm DIN matplotlib
Verfasst: Montag 30. Juni 2014, 08:43
von gkuhl
Hi,
ich würde folgendes vorschlagen:
Code: Alles auswählen
import matplotlib.pyplot as plt
def add_ax_units(ax, xunit, yunit):
unitlabels = []
for unit, labels in zip(
[xunit, yunit], [ax.get_xticklabels(), ax.get_yticklabels()]
):
x0,y0 = labels[-2].get_position()
x1,y1 = labels[-1].get_position()
x = 0.5 * (x0 + x1)
y = 0.5 * (y0 + y1)
text = ax.text(x, y, unit)
text.update_from(labels[-1])
unitlabels.append(text)
plt.draw()
return unitlabels
Grüße
Gerrit
Re: Diagramm DIN matplotlib
Verfasst: Montag 30. Juni 2014, 16:02
von dl6tud
Vielen Dank, beide Varianten funktionieren sehr gut. Ich dachte nicht, dass das so einfach geht.
Zwei kleine Fragen habe ich noch:
(1) Die Koordinate der Sekunde wird oben referenziert. Dadurch ist das 's' oben bündig mit den Zahlen, unten wäre mir aber lieber. Gibt's dafür eine Lösung?
(2) Kann man einen Pfeil in die Achsenbeschriftung malen, wie z.B. "t ---->" und kann man die Beschriftung seitlich verschieben? Danke!!!!
Code: Alles auswählen
#!/usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
def add_ax_units(ax, xunit, yunit):
unitlabels = []
for unit, labels in zip([xunit, yunit], [ax.get_xticklabels(), ax.get_yticklabels()]):
x0,y0 = labels[-2].get_position()
x1,y1 = labels[-1].get_position()
x = 0.5 * (x0 + x1)
y = 0.5 * (y0 + y1)
text = ax.text(x, y, unit)
text.update_from(labels[-1])
unitlabels.append(text)
plt.draw()
return unitlabels
t = np.arange(0.0, 1.0 + 0.01, 0.01)
s = np.cos(4 * np.pi * t) + 2
plt.plot(t, s)
#Der Plot muss schon gezeichnet sein, damit Du ihn veraendern kannst!
plt.gcf().canvas.draw()
plt.xlabel(r'$t$',fontsize=25)
plt.ylabel(r'$U$ ', rotation='horizontal',fontsize=25)
ax = plt.gca()
add_ax_units(ax, "s", "V")
plt.savefig('demo.pdf')
Re: Diagramm DIN matplotlib
Verfasst: Dienstag 1. Juli 2014, 07:47
von MagBen
dl6tud hat geschrieben:Kann man einen Pfeil in die Achsenbeschriftung malen, wie z.B. "t ---->" und kann man die Beschriftung seitlich verschieben?
Mit LaTeX Syntax:
Code: Alles auswählen
import numpy as N
import matplotlib.pyplot as P
x = N.linspace(0,1,100)
P.plot(x,x**2)
P.xlabel(r"$\qquad t \longrightarrow$", fontsize=18)
P.show()