社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用python绘制曲面[复制]

Βασιλης ΙωσηφιδΠ• 4 年前 • 772 次点击  

这个问题已经有了答案:

我试图绘制一些数据,其中包括4个变量。我用了两种方法,一种是散点图,另一种是曲面图。问题是当我使用surface时,数据丢失了。我想这和颜色设置有关。

对于散点图,我使用:

def scatter3d(x,y,z, cs, colorsMap='jet'):
   cm = plt.get_cmap(colorsMap)
   cNorm = matplotlib.colors.Normalize(vmin=min(cs), vmax=max(cs))
   scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm)
   fig = plt.figure()
   ax = Axes3D(fig)
   ax.scatter(x, y, z,c=scalarMap.to_rgba(cs))
   ax.set_xlabel('Thita1')
   ax.set_ylabel('Thita2')
   ax.set_zlabel('Fairness (%)')
   scalarMap.set_array(cs)
   fig.colorbar(scalarMap,label='Error Rate (%)')
   plt.show()

enter image description here

我想把它转换成一个曲面图,使用这个:

   def surfacePlot(x,y,z, cs, colorsMap='jet'):
    cm = plt.get_cmap(colorsMap)
    cNorm = matplotlib.colors.Normalize(vmin=min(cs), vmax=max(cs))
    scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm)
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.plot_surface(x, y, z, facecolors=scalarMap.to_rgba(cs))
    ax.set_xlabel('Thita1')
    ax.set_ylabel('Thita2')
    ax.set_zlabel('Fairness')
    scalarMap.set_array(cs)
    fig.colorbar(scalarMap,label='Error Rate (%)')
    plt.show()

但是,这将导致空网格:

enter image description here

尽管轴已从矢量中接收到最小值和最大值,但这些点已丢失。我做错什么了?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/48224
 
772 次点击  
文章 [ 1 ]  |  最新文章 4 年前
busybear
Reply   •   1 楼
busybear    5 年前

如前所述, plot_surface 需要二维数组数据或网格——类似于如果您熟悉的话如何创建热图。如果你的数据在X、Y轴(你看起来是这样)之间有规则的间隔,那么你可以简单地使用Z数据格式化成2D数组,如前面注释中链接的例子所示:

grid_x, grid_y = np.meshgrid(x, y)

# I'm assuming that your data is already mesh-like, which it looks like it is.
# The data would also need to be appropriately sorted for `reshape` to work.
# `dx` here is number of unique x values, and `dy` is number unique y values.
grid_z = z.reshape(dy, dx)

ax.plot_scatter(grid_x, grid_y, grid_z)

但是,在X、Y、Z点间距不均的一般情况下,可以插值数据以创建网格。Scipy有这个功能 griddata 将插值到定义的网格网格上。您可以使用它来绘制数据:

from scipy.interpolate import griddata
xy = np.column_stack([x, y])
grid_x, grid_y = np.mgrid[0:1:100j, 0:1:100j]  # grid you create
grid_z = griddata(xy, z, (grid_x, grid_y))
ax.plot_scatter(grid_x, grid_y, grid_z)