Matplotlib 的 rstride、cstride 弄乱了plot_surface 3D 图中的颜色图?

J.D*_*Doe 4 python matplotlib python-3.x

我有一个大型数据集,由 3595 个 .csv 文件组成,其中包含 1252 对 x,y 元组。每个文件代表一个时间范围。这些是使用plot_surf(). 我发现,在绘制数据时,默认情况下我的数据将被筛选(关于文件或时间范围),步长为 10,这就是为什么我需要rstride=1, cstride=1在我的艺术家中指定才能绘制所有内容。

\n\n

当我这样做时,我意外地发现了我之前遇到的问题的解决方案:默认情况下,绘图显示表面上的规则间隙,这不是所提供数据的结果。此外,颜色图“jet”未正确使用。这些问题可以从下图中看出。

\n\n

失败的阴谋

\n\n

将其与绘图实际的样子进行比较:

\n\n

在此输入图像描述

\n\n

我在代码中更改的只是plot_surf函数的args rstride和cstride,这伴随着非常非常长的执行时间。但我确实得到了正确的结果。

\n\n

所以我的问题是:什么给出了?为什么这个突然起作用了?为什么没有间隙的颜色图/绘图不适用于默认步幅?

\n\n

这是我的代码:

\n\n
from mpl_toolkits.mplot3d import Axes3D\nimport matplotlib.pyplot as plt\nfrom matplotlib import cm\nimport matplotlib.ticker as tkr\nimport numpy as np\nimport glob\nimport pandas as pd\n\nFiles = glob.glob(\'*.xy\')\ndtime = 1\n\nZ = np.array([pd.read_csv(file,\n                          decimal=\',\',\n                          delim_whitespace=True,\n                          header=None,\n                          names=[\'2theta\',\'I\'])[\'I\']\n                          for num, file in enumerate(Files)\n                          if num < len(Files)])\n\n\n\nX = np.array([pd.read_csv(Files[0],\n                          decimal=\',\',\n                          delim_whitespace=True,\n                          header=None,\n                          names=[\'2theta\',\'I\'])[\'2theta\']])\n\nY = np.array([[t*dtime for t in range(0,len(Files))]])\n\nX, Y = np.meshgrid(X, Y)\n\n\nfig = plt.figure(figsize=(7,5))\nax = fig.gca(projection=\'3d\')\n\n\n# Plot the surface.\nsurf = ax.plot_surface(X,\n                       Y,\n                       Z,\n                       cmap=cm.jet,\n                       rstride=1,\n                       cstride=1,\n                       vmin=np.amin(Z),\n                       vmax=np.amax(Z),\n                       linewidth=0,\n                       antialiased=True)\n\nax.set_ylabel(r\'$t \\quad / \\quad$ s\',\n              labelpad=7)\n\nax.set_xlabel(r\'$2\\theta \\quad / \\quad \xc2\xb0$\',\n              labelpad=7)\n\nax.set_zlabel(\'$I$ in a.u.\',\n              labelpad=7)\n\n\nax.xaxis.set_major_locator(tkr.AutoLocator())\nax.yaxis.set_major_locator(tkr.AutoLocator())\nax.zaxis.set_major_locator(tkr.AutoLocator())\n\nax.get_xaxis().get_major_formatter().set_useOffset(True)\nax.get_xaxis().get_major_formatter().set_useOffset(True)\nax.get_xaxis().get_major_formatter().set_useOffset(True)\n\nfig.colorbar(surf, shrink=0.7, aspect=20, pad=0.12)\n\nplt.tight_layout()\nplt.savefig(\'3D.png\', dpi=300, bbox=\'tight\')\n
Run Code Online (Sandbox Code Playgroud)\n

Val*_*ino 6

看一下文档。特别是这个:

rstride 和 cstride kwargs 设置用于对输入数据进行采样以生成图形的步幅。如果传入 1k x 1k 数组,则步幅的默认值将导致绘制 100x100 网格。默认为 10。如果同时提供了 stride 和 count kwargs(请参阅下一节),则会引发 ValueError。

这应该回答你的问题:如果rstridecstride不为 1,则并非所有点都用于绘制曲面。
这可以节省时间,因为要绘制的点越多,计算绘图所需的时间就越长。
但同时,如果您的表面具有较高的可变性,则在图中跳过 10 个点以上的 9 个点将导致不同的图片。