Ich habe eine sehr einfache Frage. Ich brauche eine zweite x-Achse in meinem Diagramm und möchte, dass diese Achse eine bestimmte Anzahl von Tics hat, die einer bestimmten Position der ersten Achse entsprechen.
Versuchen wir es mit einem Beispiel. Hier zeichne ich die Masse der Dunklen Materie als Funktion des Expansionsfaktors, definiert als 1 / (1 + z), der von 0 bis 1 reicht.
semilogy(1/(1+z),mass_acc_massive,'-',label='DM')
xlim(0,1)
ylim(1e8,5e12)
Ich hätte gerne eine weitere x-Achse oben in meinem Diagramm, die das entsprechende z für einige Werte des Expansionsfaktors anzeigt. Ist das möglich? Wenn ja, wie kann ich xtics ax haben?
python
matplotlib
Brian
quelle
quelle
Antworten:
Ich nehme einen Hinweis aus den Kommentaren in @ Dharas Antwort. Es hört sich so an, als ob Sie eine Liste
new_tick_locations
mit einer Funktion von der alten x-Achse zur neuen x-Achse erstellen möchten . Dastick_function
Folgende nimmt eine Reihe von Punkten auf, ordnet sie einem neuen Wert zu und formatiert sie:import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.add_subplot(111) ax2 = ax1.twiny() X = np.linspace(0,1,1000) Y = np.cos(X*20) ax1.plot(X,Y) ax1.set_xlabel(r"Original x-axis: $X$") new_tick_locations = np.array([.2, .5, .9]) def tick_function(X): V = 1/(1+X) return ["%.3f" % z for z in V] ax2.set_xlim(ax1.get_xlim()) ax2.set_xticks(new_tick_locations) ax2.set_xticklabels(tick_function(new_tick_locations)) ax2.set_xlabel(r"Modified x-axis: $1/(1+X)$") plt.show()
quelle
ax.set_yscale('log')
?ax2.set_xlim(ax1.get_xlim())
sonst dieX
für die Oberseite und dieX
für die Unterseite unterschiedlich sind.Sie können Twiny verwenden, um 2 x-Achsen-Skalen zu erstellen. Zum Beispiel:
import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.add_subplot(111) ax2 = ax1.twiny() a = np.cos(2*np.pi*np.linspace(0, 1, 60.)) ax1.plot(range(60), a) ax2.plot(range(100), np.ones(100)) # Create a dummy plot ax2.cla() plt.show()
Ref: http://matplotlib.sourceforge.net/faq/howto_faq.html#multiple-y-axis-scales
Ausgabe:
quelle
Wenn Sie möchten, dass Ihre obere Achse eine Funktion der Tick-Werte der unteren Achse ist:
import matplotlib.pyplot as plt fig, ax1 = plt.subplots() ax1 = fig.add_subplot(111) ax1.plot(range(5), range(5)) ax1.grid(True) ax2 = ax1.twiny() ax1Xs = ax1.get_xticks() ax2Xs = [] for X in ax1Xs: ax2Xs.append(X * 2) ax2.set_xticks(ax1Xs) ax2.set_xbound(ax1.get_xbound()) ax2.set_xticklabels(ax2Xs) title = ax1.set_title("Upper x-axis ticks are lower x-axis ticks doubled!") title.set_y(1.1) fig.subplots_adjust(top=0.85) fig.savefig("1.png")
Gibt:
quelle
Beantwortung Ihrer Frage in Dharas Antwortkommentaren: " Ich möchte auf der zweiten x-Achse diese Tics: (7,8,99) entsprechend der x-Achsenposition 10, 30, 40. Ist das irgendwie möglich? " Ja , es ist.
import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.add_subplot(111) a = np.cos(2*np.pi*np.linspace(0, 1, 60.)) ax1.plot(range(60), a) ax1.set_xlim(0, 60) ax1.set_xlabel("x") ax1.set_ylabel("y") ax2 = ax1.twiny() ax2.set_xlabel("x-transformed") ax2.set_xlim(0, 60) ax2.set_xticks([10, 30, 40]) ax2.set_xticklabels(['7','8','99']) plt.show()
Du wirst kriegen:
quelle
Ab matplotlib 3.1 können Sie verwenden
ax.secondary_xaxis
import numpy as np import matplotlib.pyplot as plt x = np.linspace(1,13, num=301) y = (np.sin(x)+1.01)*3000 # Define function and its inverse f = lambda x: 1/(1+x) g = lambda x: 1/x-1 fig, ax = plt.subplots() ax.semilogy(x, y, label='DM') ax2 = ax.secondary_xaxis("top", functions=(f,g)) ax2.set_xlabel("1/(x+1)") ax.set_xlabel("x") plt.show()
quelle
Ich bin gezwungen, dies als Antwort anstelle eines Kommentars zu posten, da das Ansehen gering ist. Ich hatte ein ähnliches Problem wie Matteo. Der Unterschied besteht darin, dass ich keine Karte von meiner ersten x-Achse zu meiner zweiten x-Achse hatte, nur die x-Werte selbst. Also wollte ich die Daten auf meiner zweiten x-Achse direkt einstellen, nicht die Ticks, aber es gibt keine
axes.set_xdata
. Ich konnte Dharas Antwort verwenden, um dies mit einer Modifikation zu tun:anstatt zu verwenden:
Im Gebrauch löschte auch mein Grundstück von
ax1
.quelle