[英]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。
这应该可以回答您的问题:如果rstride
和cstride
不是 1,则并非所有点都用于绘制曲面。
这样可以节省时间,因为指向 plot 的点越多,计算 plot 所需的时间就越长。
但同时,如果您的表面具有高可变性,则在 plot 中跳过 9 点超过 10 会导致不同的画面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.