繁体   English   中英

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

[英]Matplotlib's rstride, cstride messes up color maps in plot_surface 3D plot?

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

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

失败的情节

将此与 plot 的实际外观进行比较:

在此处输入图像描述

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

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

这是我的代码:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib.ticker as tkr
import numpy as np
import glob
import pandas as pd

Files = glob.glob('*.xy')
dtime = 1

Z = np.array([pd.read_csv(file,
                          decimal=',',
                          delim_whitespace=True,
                          header=None,
                          names=['2theta','I'])['I']
                          for num, file in enumerate(Files)
                          if num < len(Files)])



X = np.array([pd.read_csv(Files[0],
                          decimal=',',
                          delim_whitespace=True,
                          header=None,
                          names=['2theta','I'])['2theta']])

Y = np.array([[t*dtime for t in range(0,len(Files))]])

X, Y = np.meshgrid(X, Y)


fig = plt.figure(figsize=(7,5))
ax = fig.gca(projection='3d')


# Plot the surface.
surf = ax.plot_surface(X,
                       Y,
                       Z,
                       cmap=cm.jet,
                       rstride=1,
                       cstride=1,
                       vmin=np.amin(Z),
                       vmax=np.amax(Z),
                       linewidth=0,
                       antialiased=True)

ax.set_ylabel(r'$t \quad / \quad$ s',
              labelpad=7)

ax.set_xlabel(r'$2\theta \quad / \quad °$',
              labelpad=7)

ax.set_zlabel('$I$ in a.u.',
              labelpad=7)


ax.xaxis.set_major_locator(tkr.AutoLocator())
ax.yaxis.set_major_locator(tkr.AutoLocator())
ax.zaxis.set_major_locator(tkr.AutoLocator())

ax.get_xaxis().get_major_formatter().set_useOffset(True)
ax.get_xaxis().get_major_formatter().set_useOffset(True)
ax.get_xaxis().get_major_formatter().set_useOffset(True)

fig.colorbar(surf, shrink=0.7, aspect=20, pad=0.12)

plt.tight_layout()
plt.savefig('3D.png', dpi=300, bbox='tight')

看看文档 特别是这个:

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

这应该可以回答您的问题:如果rstridecstride不是 1,则并非所有点都用于绘制曲面。
这样可以节省时间,因为指向 plot 的点越多,计算 plot 所需的时间就越长。
但同时,如果您的表面具有高可变性,则在 plot 中跳过 9 点超过 10 会导致不同的画面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM