Wie kann ich in Matplotlib ein Dichtediagramm mit logarithmisch skalierten Achsen erstellen?Python

Python-Programme
Guest
 Wie kann ich in Matplotlib ein Dichtediagramm mit logarithmisch skalierten Achsen erstellen?

Post by Guest »

Ich möchte eine Skalardichte als Funktion zweier Variablen x und y darstellen, die möglicherweise logarithmisch skaliert werden kann. Ich führe im Wesentlichen Simulationen für jedes Paar von x und y durch und möchte die Daten mit einer schönen Farbkarte melden. Allerdings stoße ich auf das Problem, dass ich imshow nicht dazu bringen kann, die Daten korrekt zu skalieren. Während pcolormesh zuverlässig funktioniert, erzeugt es Dateien, die um Größenordnungen größer sind und oft nicht ohne Artefakte (wie dünne weiße Linien zwischen Datenpunkten) angezeigt werden können.
Hier ist etwas Code dazu Reproduzieren Sie das Problem:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.image import NonUniformImage

# calculate axis positions
x = np.geomspace(1, 100, 5)
dx = np.sqrt(x[1] / x[0]) # half the difference between points in logspace
y = np.linspace(0, 1, 3)
dy = (y[1] - y[0]) / 2 # half the difference between points in linspace
extent = (x[0] / dx, x[-1] * dx, y[0] - dy, y[-1] + dy)

# get some random image data to plot
z = np.random.uniform(size=(len(x), len(y)))
# create figure axes
fig, ax = plt.subplots(ncols=3, figsize=(12, 3))

# use imshow to plot array
ax[0].imshow(z.T, origin="lower", aspect="auto", extent=extent)
ax[0].set_xscale("log")
ax[0].set_title("imshow")

# use NonUniformImage to plot array
im = NonUniformImage(ax[1], extent=extent)
im.set_data(x, y, z.T)
ax[1].add_image(im)
ax[1].set_xscale("log")
ax[1].set_title("NonUniformImage")

# use pcolormesh to plot array
x2 = np.geomspace(*extent[:2], 6)
y2 = np.linspace(*extent[2:], 4)
ax[2].pcolormesh(x2, y2, z.T)
ax[2].set_title("pcolormesh")

# set axis scales
for i in range(3):
ax.set_xlim(*extent[:2])
ax.set_ylim(*extent[2:])
ax.set_xscale("log")

plt.show()

Die Ausführung dieses Beispiels führt zu folgendem Bild
[img]https://i .sstatic.net/IYoJN2yW.png[/img]

Imshow verzerrt das Bild eindeutig, vermutlich weil davon ausgegangen wird, dass das Bild Daten auf einer linear skalierten Achse enthält.Das zweite Panel zeigt meinen Versuch, NonUniformImage zu verwenden, was aus irgendeinem Grund völlig schief geht.
Das dritte Panel zeigt, was ich sehen möchte, allerdings unter Verwendung von pcolormesh, das die schwerwiegenden Nachteile hat, die ich erwähnt habe oben.
Im Wesentlichen möchte ich nur ein „normales“ Bild mit rechteckigen Pixeln gleicher Größe auf einer logarithmisch skalierten Achse anzeigen. Ich denke, das sollte möglich sein, aber ich habe es nicht geschafft. Ich erinnere mich auch vage daran, dass das in der ersten Spalte gezeigte Beispiel vor ein paar Jahren funktionierte, aber anscheinend ist dies nicht mehr der Fall. Jede Hilfe bei der Lösung dieses Problems wäre sehr dankbar!
Beachten Sie, dass diese ältere Antwort nicht richtig funktioniert, da sie einfach Achsen mit logarithmischen Teilstrichen hinzufügt, sodass der Benutzer nicht zuverlässig mit dem Ergebnis interagieren kann ( z.B. um die Häkchen nachträglich zu ändern).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post