這是由於matplotlib中的路徑簡化算法。雖然在某些情況下它確實不可取,但這是故意加快渲染的行爲。
爲了避免跳過「異常點」,簡化算法在某些時候發生了變化,因此mpl的較新版本沒有表現出這種確切的行爲(儘管路徑仍然是簡化的)。
如果您不想簡化路徑,那麼您可以在rc參數中(在您的.matplotlibrc
文件中或在運行時)禁用它。
E.g.
import matplotlib as mpl
mpl.rcParams['path.simplify'] = False
import matplotlib.pyplot as plt
但是,使用「envelope」樣式圖可能更有意義。作爲一個簡單的例子:
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()
您正在使用什麼版本MPL的?如果它是最新的,你應該在github跟蹤器上創建一個問題(這將確保這個問題得到核心開發者的關注)。您可以發表一個您用於生成該圖表的示例數據集+代碼嗎?它使測試變得更容易。 – tacaswell 2013-04-03 19:45:46
如果您使用'plot(...,marker ='。',linestyle =' - ')'它是否正確地達到了最小/最大值? – tacaswell 2013-04-03 20:06:21
@tcaswell添加代碼。標記和線型更改沒有幫助。謝謝。 – Doug 2013-04-03 23:26:01