簡體   English   中英

Python和Matplotlib:如何創建網狀網格來繪制沖浪?

[英]Python & Matplotlib: How to create a meshgrid to plot surf?

我想繪制一個概率密度函數z=f(x,y) 我在使用表面漸變的Color matplotlib plot_surface命令中找到了用於繪制沖浪的代碼

但是我不知道如何將z值轉換為grid因此我可以將其繪制出來示例代碼及其修改如下。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import mixture
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

%matplotlib inline

n_samples = 1000

# generate random sample, two components
np.random.seed(0)
shifted_gaussian = np.random.randn(n_samples, 2) + np.array([20, 5])
sample = shifted_gaussian

# fit a Gaussian Mixture Model with two components
clf = mixture.GMM(n_components=3, covariance_type='full')
clf.fit(sample)

# Plot it
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, .25)
Y = np.arange(-5, 5, .25)
X, Y = np.meshgrid(X, Y)
## In example Code, the z is generate by grid
# R = np.sqrt(X**2 + Y**2)
# Z = np.sin(R)

# In my case,
# for each point [x,y], the probability value is
# z = clf.score([x,y])
# but How can I generate a grid Z?

Gx, Gy = np.gradient(Z) # gradients with respect to x and y
G = (Gx**2+Gy**2)**.5  # gradient magnitude
N = G/G.max()  # normalize 0..1
surf = ax.plot_surface(
    X, Y, Z, rstride=1, cstride=1,
    facecolors=cm.jet(N),
    linewidth=0, antialiased=False, shade=False)
plt.show()

繪制z的原始方法是通過網格生成。 但是在我的情況下,擬合模型無法以grid-like樣式返回結果,所以問題是如何生成grid-style z值並繪制它?

如果我理解正確,您基本上就有一個函數z ,該函數在列表中采用兩個標量值x,y並返回另一個標量z_val 換句話說z_val = z([x,y]) ,對嗎?

如果是這樣,您可以執行以下操作(請注意,編寫本文時並未考慮效率,而是着重於可讀性):

from itertools import product

X = np.arange(15) # or whatever values for x
Y = np.arange(5)  # or whatever values for y
N, M = len(X), len(Y)
Z = np.zeros((N, M))
for i, (x,y) in enumerate(product(X,Y)):
    Z[np.unravel_index(i, (N,M))] = z([x,y])

如果要使用plot_surface ,請遵循以下步驟:

X, Y = np.meshgrid(X, Y)
ax.plot_surface(X, Y, Z.T)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM