it-swarm.com.de

So zoomen Sie einen Bildausschnitt und fügen ihn in dieselbe Grafik in matplotlib ein

Ich möchte einen Teil der Daten/Bilder zoomen und in der gleichen Abbildung darstellen. Es sieht ungefähr so ​​aus.

zoomed plot

Ist es möglich, einen Teil des gezoomten Bildes in dasselbe Diagramm einzufügen? Ich denke, es ist möglich, eine andere Figur mit Untergrund zu zeichnen, aber es werden zwei verschiedene Figuren gezeichnet. Ich habe auch gelesen, Patches zum Einfügen von Rechtecken/Kreisen hinzuzufügen, bin mir aber nicht sicher, ob es sinnvoll ist, einen Teil des Bildes in die Figur einzufügen. Grundsätzlich lade ich Daten aus der Textdatei und zeichne sie mit den unten gezeigten einfachen Zeichnungsbefehlen.

Ich habe ein verwandtes Beispiel aus der matplotlib-Bildergalerie gefunden hier aber nicht sicher, wie es funktioniert. Deine Hilfe ist sehr Willkommen.

from numpy import *
import os
import matplotlib.pyplot as plt
data = loadtxt(os.getcwd()+txtfl[0], skiprows=1)
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.semilogx(data[:,1],data[:,2])
plt.show()
43
Elect28

Das Spielen mit ausführbarem Code ist eine der schnellsten Methoden, um Python zu lernen.

Beginnen wir also mit Code aus der matplotlib-Beispielgalerie .

Angesichts der Kommentare im Code scheint der Code in vier Hauptzeilen unterteilt zu sein. Die erste Strophe generiert einige Daten, die zweite Strophe generiert das Hauptdiagramm, die dritte und vierte Strophe erstellen die eingefügten Achsen.

Wir wissen, wie Daten generiert und die Hauptdarstellung gezeichnet werden, konzentrieren wir uns also auf die dritte Strophe:

a = axes([.65, .6, .2, .2], axisbg='y')
n, bins, patches = hist(s, 400, normed=1)
title('Probability')
setp(a, xticks=[], yticks=[])

Kopieren Sie den Beispielcode in eine neue Datei mit dem Namen test.py.

Was passiert, wenn wir den .65 In .3 Ändern?

a = axes([.35, .6, .2, .2], axisbg='y')

Führen Sie das Skript aus:

python test.py

Sie finden den Einschub "Wahrscheinlichkeit" nach links verschoben. Die Funktion axes steuert also die Platzierung des Insets. Wenn Sie mehr mit den Zahlen spielen, werden Sie feststellen, dass (.35, .6) die Position der unteren linken Ecke des Einschubs und (.2, .2) die Breite und Höhe des Einschubs ist. Die Zahlen gehen von 0 bis 1 und (0,0) ist die in der unteren linken Ecke der Figur befindliche Zahl.

Okay, jetzt kochen wir. In der nächsten Zeile haben wir:

n, bins, patches = hist(s, 400, normed=1)

Sie können dies als matplotlib-Befehl zum Zeichnen eines Histogramms erkennen. Wenn Sie jedoch die Zahl 400 auf beispielsweise 10 ändern, wird ein Bild mit einem viel klobigeren Histogramm erstellt Zahlen werden Sie bald herausfinden, dass diese Linie etwas mit dem Bild im Einschub zu tun hat.

Sie möchten hier semilogx(data[3:8,1],data[3:8,2]) aufrufen.

Die Zeile title('Probability') erzeugt offensichtlich den Text über dem Einschub.

Schließlich kommen wir zu setp(a, xticks=[], yticks=[]). Es sind keine Zahlen zum Spielen vorhanden. Was passiert also, wenn Sie die gesamte Zeile auskommentieren, indem Sie am Zeilenanfang ein # Einfügen:

# setp(a, xticks=[], yticks=[])

Führen Sie das Skript erneut aus. Oh! Jetzt gibt es viele Häkchen und Häkchenbeschriftungen auf den Einschubachsen. Fein. Jetzt wissen wir also, dass setp(a, xticks=[], yticks=[]) die Häkchen und Beschriftungen von den Achsen a entfernt.

Theoretisch haben Sie jetzt genügend Informationen, um diesen Code auf Ihr Problem anzuwenden. Es gibt aber noch einen möglichen Stolperstein: Das matplotlib-Beispiel verwendet from pylab import *, Während Sie import matplotlib.pyplot as plt Verwenden.

Die matplotlib-FAQ sagt, dass import matplotlib.pyplot as plt Die empfohlene Methode ist, um matplotlib beim Schreiben von Skripten zu verwenden, während from pylab import * Für interaktive Sitzungen verwendet wird. Sie machen es also richtig (obwohl ich empfehlen würde, statt import numpy as np Auch from numpy import * Zu verwenden).

Wie konvertieren wir das matplotlib-Beispiel, um es mit import matplotlib.pyplot as plt Auszuführen?

Die Konvertierung erfordert einige Erfahrung mit matplotlib. Im Allgemeinen fügen Sie einfach plt. Vor bloßen Namen wie axes und setp ein, aber manchmal kommt die Funktion von numpy, und manchmal sollte der Aufruf von einem Axis-Objekt kommen. nicht aus dem Modul plt. Es braucht Erfahrung, um zu wissen, woher all diese Funktionen kommen. Es kann hilfreich sein, die Namen von Funktionen zusammen mit "matplotlib" zu googeln. Das Lesen von Beispielcode kann Erfahrung schaffen, aber es gibt keine einfache Verknüpfung.

So wird der konvertierte Code

ax2 = plt.axes([.65, .6, .2, .2], axisbg='y')
ax2.semilogx(t[3:8],s[3:8])
plt.setp(ax2, xticks=[], yticks=[])

Und Sie könnten es in Ihrem Code so verwenden:

from numpy import *
import os
import matplotlib.pyplot as plt
data = loadtxt(os.getcwd()+txtfl[0], skiprows=1)
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.semilogx(data[:,1],data[:,2])

ax2 = plt.axes([.65, .6, .2, .2], axisbg='y')
ax2.semilogx(data[3:8,1],data[3:8,2])
plt.setp(ax2, xticks=[], yticks=[])

plt.show()
30
unutbu

Am einfachsten ist es, "zoomed_inset_axes" und "mark_inset" zu kombinieren, deren Beschreibung und zugehörige Beispiele hier zu finden sind: Übersicht über das AxesGrid-Toolkit

enter image description here

26
kevin

Der beste Weg, dies zu tun, ist die Verwendung von mpl_toolkits.axes_grid1.inset_locator (Teil von matplotlib).

Hier gibt es ein großartiges Beispiel mit Quellcode: enter image description herehttps://github.com/NelleV/jhepc/tree/master/2013/entry1

22
David Ketcheson

Die grundlegenden Schritte zum Vergrößern eines Teils einer Figur mit matplotlib

import numpy as np
from matplotlib import pyplot as plt

# Generate the main data
X = np.linspace(-6, 6, 1024)
Y = np.sinc(X)

# Generate data for the zoomed portion
X_detail = np.linspace(-3, 3, 1024)
Y_detail = np.sinc(X_detail)

# plot the main figure
plt.plot(X, Y, c = 'k')  

 # location for the zoomed portion 
sub_axes = plt.axes([.6, .6, .25, .25]) 

# plot the zoomed portion
sub_axes.plot(X_detail, Y_detail, c = 'k') 

# insert the zoomed figure
# plt.setp(sub_axes)

plt.show()

enter image description here

7
Amjad