wake-up-neo.net

zwei (oder mehr) Grafiken in einem Diagramm mit unterschiedlichen X-Achsen- und Y-Achsen-Skalen in Python

Ich möchte 3 Diagramme auf einem Achsenobjekt, zum Beispiel:

#example x- and y-data
x_values1=[1,2,3,4,5]
y_values1=[1,2,3,4,5]

x_values2=[-1000,-800,-600,-400,-200]
y_values2=[10,20,39,40,50]

x_values3=[150,200,250,300,350]
y_values3=[10,20,30,40,50]


#make axes
fig=plt.figure()
ax=fig.add_subplot(111)

jetzt möchte ich alle drei Datensätze zu ax hinzufügen. Aber sie sollten keine X- oder Y-Achse teilen (seitdem wäre die Skala wegen der unterschiedlichen Skalen viel kleiner als die andere. Ich brauche so etwas wie ax.twinx (), ax.twiny ( ), aber sowohl die x- als auch die y-Achse müssen unabhängig sein.

Ich möchte dies tun, weil ich die beiden beigefügten Diagramme (und ein drittes, das dem zweiten ähnelt) in einem Diagramm zusammenfassen möchte ("legen Sie sie übereinander") . Plot1Plot2

Ich würde dann die x/y-Labels (und/oder Ticks, Limits) des zweiten Plots rechts/oben und die x/y-Limits eines anderen Plots unten/links setzen. Ich brauche keine x/y-Labels der 3. Zeichnung.

Wie mache ich das?

8

Die Idee wäre, drei Unterzeichnungen an derselben Position zu erstellen. Um sicher zu gehen, werden sie als unterschiedliche Darstellungen erkannt, ihre Eigenschaften müssen sich unterscheiden - und der einfachste Weg, dies zu erreichen, besteht einfach darin, ein anderes Label, ax=fig.add_subplot(111, label="1"), bereitzustellen.

Der Rest besteht einfach darin, alle Achsenparameter so anzupassen, dass das resultierende Diagramm ansprechend aussieht. Es ist ein bisschen Arbeit, alle Parameter einzustellen, aber das Folgende sollte tun, was Sie brauchen.

 enter image description here

import matplotlib.pyplot as plt

x_values1=[1,2,3,4,5]
y_values1=[1,2,2,4,1]

x_values2=[-1000,-800,-600,-400,-200]
y_values2=[10,20,39,40,50]

x_values3=[150,200,250,300,350]
y_values3=[10,20,30,40,50]


fig=plt.figure()
ax=fig.add_subplot(111, label="1")
ax2=fig.add_subplot(111, label="2", frame_on=False)
ax3=fig.add_subplot(111, label="3", frame_on=False)

ax.plot(x_values1, y_values1, color="C0")
ax.set_xlabel("x label 1", color="C0")
ax.set_ylabel("y label 1", color="C0")
ax.tick_params(axis='x', colors="C0")
ax.tick_params(axis='y', colors="C0")

ax2.scatter(x_values2, y_values2, color="C1")
ax2.xaxis.tick_top()
ax2.yaxis.tick_right()
ax2.set_xlabel('x label 2', color="C1") 
ax2.set_ylabel('y label 2', color="C1")       
ax2.xaxis.set_label_position('top') 
ax2.yaxis.set_label_position('right') 
ax2.tick_params(axis='x', colors="C1")
ax2.tick_params(axis='y', colors="C1")

ax3.plot(x_values3, y_values3, color="C3")
ax3.set_xticks([])
ax3.set_yticks([])

plt.show()

Sie können die Daten auch so vereinheitlichen, dass sie dieselben Grenzwerte aufweisen, und dann die Grenzwerte der gewünschten zweiten Skala "manuell" darstellen. Diese Funktion standardisiert die Daten an die Grenzwerte der ersten Punktmenge:

def standardize(data):
    for a in range(2):
        span = max(data[0][a]) - min(data[0][a])
        min_ = min(data[0][a])
        for idx in range(len(data)):
            standardize = (max(data[idx][a]) - min(data[idx][a]))/span
            data[idx][a] = [i/standardize + min_ - min([i/standardize 
                            for i in data[idx][a]]) for i in data[idx][a]]
    return data

Dann ist das Plotten der Daten einfach:

import matplotlib.pyplot as plt
data = [[[1,2,3,4,5],[1,2,2,4,1]], [[-1000,-800,-600,-400,-200], [10,20,39,40,50]], [[150,200,250,300,350], [10,20,30,40,50]]]
limits = [(min(data[1][a]), max(data[1][a])) for a in range(2)]

norm_data = standardize(data)

fig, ax = plt.subplots()

for x, y in norm_data:
    ax.plot(x, y)

ax2, ax3 = ax.twinx(), ax.twiny()
ax2.set_ylim(limits[1])
ax3.set_xlim(limits[0])

plt.show()

Da alle Datenpunkte die Grenzen des ersten Punktesatzes haben, können wir sie einfach auf derselben Achse darstellen. Mit den Grenzen der gewünschten zweiten x- und y-Achse können wir dann die Grenzen für diese beiden festlegen.

 Rsulting plot

1
Tristan