2016-09-05 2 views
0

Ich habe eine Matrix H, die 3 Richtungsargumente nehmen kann. Ich möchte die Eigenwerte (nur als Funktion) mit einem Satz von Argumenten plotten & daneben - immer noch in der gleichen Grafik - die Funktion mit einem anderen Satz von Argumenten. Dies wird sehr oft in der Physik verwendet, z. B. beim Zeichnen von Bandstrukturen. Es sieht aus wie:zeichnen Sie eine Funktion in der gleichen Grafik mit verschiedenen Argumenten nebeneinander

enter image description here

Dies nicht nur 0 bis Gamma und 2pi Wechsel (Gitterkonstante = 1) bis X, aber wirklich mutlipleplots nebeneinander in einem Plot zu tun.

Edit:

Ich habe keine Messdaten -> das alles berechnet wird. Ich habe eine np.matrix (Hamiltonian - 8x8), die von 7 Argumenten abhängt, die einzigen, die ich hier ändere, sind die der Richtungen. g = Gamma, X, ... sind Positionen (Ich kenne die Richtungen von ihnen.) Jede Parzelle wird wie folgt generiert:

fig4=plt.figure() 
LG=fig4.add_subplot(111) 
for val in np.linspace(-np.pi/a, 0, 1000): 
    LG.scatter([val]*8, H(val, val , val, -15.2, -s*10.25, 19.60, -5.30)) 
plt.grid() 
plt.title(r"$L-\Gamma$") 
plt.xlabel(r"$k$ in high symmetry points") 
plt.xticks([-C*0.5, 0.], ["L", "$\Gamma$"]) 
plt.ylabel("energy/eV") 
plt.show() 

I umfasste die Physik, so dass Ärzte es leichter zu verstehen. Wenn sie nicht viele sind:

Ich habe eine Funktion Plot1 und Plot2 & Ich möchte Plot2 horizontal in einem Diagramm mit gleichen y-Achsen, aber verschiedenen X-Achsen anhängen. Wie im Bild (von g-X ist eine Funktion, von X zu W anderen und so weiter).

Edit2: Die Antwort von TobyD & pathoren machte es möglich, eine Funktion w/mehrere Argumente neben jedem w/free Argumente zu plotten. Ich denke, dass mein Problem damit prinzipiell lösbar ist, aber da ich keine Funktionen sondern eine Matrix habe und Eigenwerte berechnen möchte und mehr als ein Richtungsargument habe, ist es kompliziert. Es gelingt mir, eine Zeichnung zu erstellen, die ich nur horizontal zusammen schneiden möchte (aber nicht wie Farbe, sondern mit einer Beschreibung der x-Achsen).

Edit3: Vielen Dank & TobyD für Ihre Hilfe pathoren. Der einfachste Weg war, einfach das Argument x + etwas zu ändern, x-etwas, jetzt habe ich mehr als den Weg, was letztendlich nützlich sein kann.

final answer

+0

Bitte fügen Sie, was Sie bisher und einige Beispieldaten getan haben. Es hört sich für mich so an, als würde man einfach alles auf einer Achse zeichnen und eine punktierte "axhspan" -Linie bei Null hinzufügen. –

+0

Gehen Sie zu [der Galerie] (http://matplotlib.org/gallery.html#) und schauen Sie sich um, bis Sie ein Bild sehen, das dem, was Sie machen möchten, nahe kommt, und schauen Sie sich seinen Code an, um zu sehen, wie er es gemacht hat. Wie [plot_fivethirtyeight] (http://matplotlib.org/gallery.html#style_sheets) – wwii

Antwort

1

Lassen Sie mich sehen, wenn ich zu verstehen, was Sie nach richtig sind.

so etwas wie dieses Versuchen:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

fig = plt.figure() 
gs = gridspec.GridSpec(1,n, width_ratios = [width_1,...,width_n]) 
axes = [plt.subplot(subplot) for subplot in gs] 
fig.subplots_adjust(wspace=0) 

wobei n die Anzahl unterschiedlichen Argument setzt man Plotten und width_n sein will, ist die Breite jeder in was auch immer Einheiten, die Sie auf Ihrer Normalisierung basierend wählen.

Der Parameter subplots_adjust legt den Abstand zwischen den Unterplots auf 0 fest. Mit GridSpec haben Sie eine feinere Kontrolle über die Größen jedes Elements. Das Flag sharey funktioniert nicht mit gridspec, daher müssen wir manuell mit den y-Ticks experimentieren.

Sie können dann die Funktion für jeden Argumentsatz in einem Achsenelement mit den gewünschten Bereichen darstellen. Behandeln Sie jedes Achsenelement grundsätzlich als eines der Diagramme, die Sie zusammen darstellen möchten.

das gleiche Beispiel wie @pathoren Verwendung:

def f(x, a, b, c): 
    return a*x**2 + b*x + c 

fig = plt.figure() 
gs = gridspec.GridSpec(1, 3, width_ratios = [3, 2, 1]) 
axes = [plt.subplot(subplot) for subplot in gs] 
fig.subplots_adjust(wspace=0) 

x = np.linspace(0, 10, 100) 
y = np.linspace(2, 5 ,100) 
z = np.linspace(0, 2*np.pi, 100) 

f1 = f(x, 1, 2, 3) 
f2 = f(y, 3, -2, 0) 
f3 = f(z, -1, 2, 1) 

axes[0].plot(x, f1, label='f1') 
axes[0].set_xticks([0, 10]) 
axes[0].set_xticklabels(["L", "X"]) 
axes[0].yaxis.tick_left()  

axes[1].plot(y, f2, label='f2') 
axes[1].set_xticks([5]) 
axes[1].set_xticklabels(["G"]) 
axes[1].yaxis.set_tick_params(size=0) 
plt.setp(axes[1].get_yticklabels(), visible=False) 

axes[2].plot(z, f3, label='f3') 
axes[2].set_xticks([2*np.pi]) 
axes[2].set_xticklabels(["Y"]) 
axes[2].yaxis.tick_right()  
axes[2].set_xlim([z[0],z[-1]]) 
plt.setp(axes[2].get_yticklabels(), visible=False) 

plt.show() 

anzumerken, dass die Funktionen zum Ändern subplot wie die xticks Attribute sind etwas anders. Mit axes[2].set_xlim wird sichergestellt, dass der letzte Graph gut abgeschnitten wird.

Example Graph

+0

Ja, ich meinte es so - die x-Werte können sich überlappen. Zusätzlich möchte ich den Bereich für jedes Teil auf den X-Achsen selbst festlegen. h.: ​​K = 10 bis L = 20 ist 5 Einheiten und von L = 20 bis M = 50 sind 3 Einheiten in dem Pfaddiagramm. (K, L, M sind in Wirklichkeit Koordinaten von 3D-Objekten und die Länge sollte durch die Norm des Verbindungsvektors bestimmt werden, nicht die Länge in einer Richtung) – Carsten

+0

@Carsten Ich habe meine Anwser aktualisiert, um die Spezifikation der Breiten – TobyD

-1

Unten ist ein Skript, in dem eine Funktion fa, b, c 3 Parameter übernimmt. Die x-Werte sind in drei verschiedene Bereiche unterteilt, x1, x2, x3, mit entsprechenden Funktionswerten f1, f2, f3. An einigen Breakpoints (definiert durch x_ticks) sind Linien gezeichnet, und die Xticks werden nur für diese Punkte angezeigt. Die xlabels werden gesetzt von x_ticklabels, nur unter x_ticks -position.

import numpy as np 
import matplotlib.pyplot as plt 

def f(x, a, b, c): 
    return a*x**2 + b*x + c 

x1 = np.linspace(0, 10, 100) 
f1 = f(x1, 1, 2, 3) 
x2 = np.linspace(10, 20, 100) 
f2 = f(x2, 3, -2, 0) 
x3 = np.linspace(20, 50, 100) 
f3 = f(x3, -1, 2, 1) 

fig, ax = plt.subplots(1, 1) 

ax.plot(x1, f1, label='f1') 
ax.plot(x2, f2, label='f2') 
ax.plot(x3, f3, label='f3') 
x_ticks = [10, 20, 50] 
x_ticklabels = ['K', 'L', 'M'] 
ax.vlines(x_ticks, ax.get_ylim()[0], ax.get_ylim()[1]) 
ax.set_xticks(x_ticks) 
ax.set_xticklabels(x_ticklabels) 
ax.set_yticks([]) 

plt.show() 

enter image description here

+0

Und jetzt möchte ich diese 3 Funktionen in einem Diagramm aber nebeneinander, wo die y-Achse gleich bleibt, aber die x-Achse ist frei wählbar. Wie f1 (x, 1, 2, 3) mit 0 Carsten

+0

Ich habe meine Antwort aktualisiert. Geht das für dich? – pathoren

Verwandte Themen