gpt4 book ai didi

python - 密集数据集的 matplotlib 主要显示问题

转载 作者:太空狗 更新时间:2023-10-30 02:47:46 24 4
gpt4 key购买 nike

我在使用 matplotlib 和 Python 时遇到了一个相当严重的问题。我有一个密集的周期图数据集,想绘制它。问题是,当数据点多于可以在像素上绘制的数据点时,程序包不会选择要显示的最小值和最大值。这意味着随便看一下剧情可能会导致您得出错误的结论。

这是此类问题的示例:
example

数据集是用 plot()scatter() 覆盖绘制的。您可以看到,在密集的数据字段中,连接数据的蓝线没有达到实际的峰值,导致人类观察者认为 ~2.4 处的峰值是最大值,但事实并非如此。

如果您放大或强制使用宽 window ,它会正确显示。 rasterizeaa 关键字对该问题没有影响。

有没有办法确保始终呈现 plot() 调用的最小/最大点?否则,这需要在更新 matplotlib 时解决。我从来没有遇到过这样的绘图包,这是一个非常重要的问题。

编辑:

x = numpy.linspace(0,1,2000000)
y = numpy.random.random(x.shape)
y[1000000]=2

plot(x,y)
show()

应该重现问题。尽管这可能取决于您的显示器分辨率。通过拖动和调整窗口大小,您应该可以看到问题所在。一个数据点应该突出一个 y=2,但这并不总是显示。

最佳答案

这是由于 matplotlib 中的路径简化算法。虽然在某些情况下肯定不可取,但这是加速渲染的故意行为。

简化算法在某些时候发生了变化,以避免跳过“异常”点,因此较新版本的 mpl 不会表现出这种确切的行为(尽管路径仍然被简化)。

如果您不想简化路径,那么您可以在 rc 参数中禁用它(在您的 .matplotlibrc 文件中或在运行时)。

例如

import matplotlib as mpl
mpl.rcParams['path.simplify'] = False
import matplotlib.pyplot as plt

但是,使用“信封”样式的图可能更有意义。举个简单的例子:

import matplotlib.pyplot as plt
import numpy as np

def main():
num = 10000
x = np.linspace(0, 10, num)
y = np.cos(x) + 5 * np.random.random(num)

fig, (ax1, ax2) = plt.subplots(nrows=2)
ax1.plot(x, y)
envelope_plot(x, y, winsize=40, ax=ax2)
plt.show()

def envelope_plot(x, y, winsize, ax=None, fill='gray', color='blue'):
if ax is None:
ax = plt.gca()
# Coarsely chunk the data, discarding the last window if it's not evenly
# divisible. (Fast and memory-efficient)
numwin = x.size // winsize
ywin = y[:winsize * numwin].reshape(-1, winsize)
xwin = x[:winsize * numwin].reshape(-1, winsize)
# Find the min, max, and mean within each window
ymin = ywin.min(axis=1)
ymax = ywin.max(axis=1)
ymean = ywin.mean(axis=1)
xmean = xwin.mean(axis=1)

fill_artist = ax.fill_between(xmean, ymin, ymax, color=fill,
edgecolor='none', alpha=0.5)
line, = ax.plot(xmean, ymean, color=color, linestyle='-')
return fill_artist, line

if __name__ == '__main__':
main()

enter image description here

关于python - 密集数据集的 matplotlib 主要显示问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15795720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com