Wie man eine 3D-Dichtekarte in Python mit Matplotlib plottet
Ich habe einen großen Datensatz mit (x,y,z) - protein Positionen und möchte plot Bereichen der hohen Inanspruchnahme als heatmap. Idealerweise sollte die Ausgabe ähnlich Aussehen, um die volumetrische Visualisierung unten, aber ich bin mir nicht sicher, wie Sie diese erreichen mit matplotlib.
Meine erste Idee war natürlich die Darstellung meiner Positionen als 3D-Punktwolke und Farbe, Ihre Dichte, die über ein KDE. Ich codiert, das wie folgt mit test-Daten:
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
mu, sigma = 0, 0.1
x = np.random.normal(mu, sigma, 1000)
y = np.random.normal(mu, sigma, 1000)
z = np.random.normal(mu, sigma, 1000)
xyz = np.vstack([x,y,z])
density = stats.gaussian_kde(xyz)(xyz)
idx = density.argsort()
x, y, z, density = x[idx], y[idx], z[idx], density[idx]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c=density)
plt.show()
Diese funktioniert gut! Aber, meine echten Daten enthält viele Tausende von Datenpunkte und die Berechnung der kde-und der scatter-plot extrem langsam wird.
Eine kleine Auswahl von meinen real Daten:
Meine Forschung würde vorschlagen, dass eine bessere option ist die Bewertung der Gauß-kde auf einem raster. Ich bin mir nur nicht sicher, wie dies in 3D:
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
mu, sigma = 0, 0.1
x = np.random.normal(mu, sigma, 1000)
y = np.random.normal(mu, sigma, 1000)
nbins = 50
xy = np.vstack([x,y])
density = stats.gaussian_kde(xy)
xi, yi = np.mgrid[x.min():x.max():nbins*1j, y.min():y.max():nbins*1j]
di = density(np.vstack([xi.flatten(), yi.flatten()]))
fig = plt.figure()
ax = fig.add_subplot(111)
ax.pcolormesh(xi, yi, di.reshape(xi.shape))
plt.show()
InformationsquelleAutor der Frage nv_wu | 2014-08-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank mwaskon - für die Annahme, den mayavi-Bibliothek.
Ich neu die Dichte Punktwolke in mayavi wie folgt:
Einstellung der scale_mode auf "none" wird verhindert, dass Glyphen wird skaliert proportional zu der Dichte-Vektor. Zusätzlich für große datasets, die ich deaktiviert-Szene-rendering und verwendet eine Maske, um reduzieren Sie die Anzahl der Punkte.
Nächsten, zu bewerten und die Gauß-kde auf einem raster:
Als Letzte Verbesserung, die ich beschleunigt, die Bewertung von kensity-Dichte-Funktion durch den Aufruf der kde-Funktion parallel.
InformationsquelleAutor der Antwort nv_wu