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.

Wie man eine 3D-Dichtekarte in Python mit Matplotlib plottet

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:

Wie man eine 3D-Dichtekarte in Python mit Matplotlib plottet

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

Schreibe einen Kommentar