# copied from
# http://matplotlib.sourceforge.net/mpl_examples/mplot3d/wire3d_demo.py
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
plt.show()
我生成了一个函数,它在matplotlib中复制了matlab瀑布行为。即: 1.它生成的三维形状为许多独立和平行的二维曲线 1.它的颜色来自z值中的色彩Map表 我从matplotlib文档中的两个例子开始:multicolor lines和multiple lines in 3d plot。从这些示例中,我只看到可以根据给定的颜色Map表根据其z值绘制颜色变化的线条,该示例重塑输入数组以通过2个点的线段绘制线条,并将线段的颜色设置为这2个点之间的z平均值。 因此,给定输入矩阵n,m、X、Y和Z,函数在n,m之间的最小维度上循环,以绘制每个瀑布图独立线,作为如上所述的2个点段的线集合。
def waterfall_plot(fig,ax,X,Y,Z,**kwargs):
'''
Make a waterfall plot
Input:
fig,ax : matplotlib figure and axes to populate
Z : n,m numpy array. Must be a 2d array even if only one line should be plotted
X,Y : n,m array
kwargs : kwargs are directly passed to the LineCollection object
'''
# Set normalization to the same values for all plots
norm = plt.Normalize(Z.min().min(), Z.max().max())
# Check sizes to loop always over the smallest dimension
n,m = Z.shape
if n>m:
X=X.T; Y=Y.T; Z=Z.T
m,n = n,m
for j in range(n):
# reshape the X,Z into pairs
points = np.array([X[j,:], Z[j,:]]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
# The values used by the colormap are the input to the array parameter
lc = LineCollection(segments, cmap='plasma', norm=norm, array=(Z[j,1:]+Z[j,:-1])/2, **kwargs)
line = ax.add_collection3d(lc,zs=(Y[j,1:]+Y[j,:-1])/2, zdir='y') # add line to axes
fig.colorbar(lc) # add colorbar, as the normalization is the same for all
# it doesent matter which of the lc objects we use
ax.auto_scale_xyz(X,Y,Z) # set axis limits
因此,可以使用与matplotlib曲面图相同的输入矩阵轻松生成看起来像matlab瀑布的图:
import numpy as np; import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from mpl_toolkits.mplot3d import Axes3D
# Generate data
x = np.linspace(-2,2, 500)
y = np.linspace(-2,2, 60)
X,Y = np.meshgrid(x,y)
Z = np.sin(X**2+Y**2)-.2*X
# Generate waterfall plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
waterfall_plot(fig,ax,X,Y,Z,linewidth=1.5,alpha=0.5)
ax.set_xlabel('X'); ax.set_ylabel('Y'); ax.set_zlabel('Z')
fig.tight_layout()
4条答案
按热度按时间ipakzgxi1#
你可以使用PolyCollection类在matplotlib中创建瀑布。请参阅这个特定的example,了解如何使用这个类做瀑布的更多细节。
此外,您可能会发现这个blog post很有用,因为作者表明您可能会在某些特定的情况下获得一些'视觉错误'(取决于所选择的视角)。
下面是一个用matplotlib制作的瀑布的例子(图片来自博客文章):
(来源:austringer.net)
yyhrrdl82#
看看mplot3d:
我不知道如何得到像Matlab一样好的结果。
如果你想了解更多,你也可以看看MayaVi:http://mayavi.sourceforge.net/
yeotifhr3#
维基百科类型的Waterfall chart也可以这样获得:
mspsb9vt4#
我生成了一个函数,它在matplotlib中复制了matlab瀑布行为。即:
1.它生成的三维形状为许多独立和平行的二维曲线
1.它的颜色来自z值中的色彩Map表
我从matplotlib文档中的两个例子开始:multicolor lines和multiple lines in 3d plot。从这些示例中,我只看到可以根据给定的颜色Map表根据其z值绘制颜色变化的线条,该示例重塑输入数组以通过2个点的线段绘制线条,并将线段的颜色设置为这2个点之间的z平均值。
因此,给定输入矩阵
n,m
、X
、Y
和Z
,函数在n,m
之间的最小维度上循环,以绘制每个瀑布图独立线,作为如上所述的2个点段的线集合。因此,可以使用与matplotlib曲面图相同的输入矩阵轻松生成看起来像matlab瀑布的图:
该函数假设在生成网格时,
x
数组是最长的,默认情况下,线的y是固定的,x坐标变化。然而,如果y
数组的大小更长,则矩阵被转置,生成具有固定x的行。因此,生成具有反转的大小(len(x)=60
和len(y)=500
)的网格得到:要了解
**kwargs
参数的可能性,请参考LineCollection类文档及其set_
方法。