2

我有一个时间序列,在一年数组大小(365、10000)的过程中,该变量的每日值将超过 10,000 个。因为我将拥有如此多的数据(许多变量的许多时间序列),我希望只保存百分位数(0、10、20、...、90、100)并稍后在绘图中使用它们来设置颜色渐变显示值的密度(显然在中位数处最暗,在最小值和最大值处最亮)。这样做的目的是避免保存的模拟输出中的文件过大,因为我将处理数百万个输出。如果我能让它工作,这将显着减少文件大小。

我能够计算样本数据集的百分位数(目前仅使用 50 个值)并按附图所示绘制它们(使用大小为 365,11 的数组)。我将如何使用这些信息来设置显示颜色渐变(或值密度)的图?这可能吗?还是有其他方法可以解决它?我正在使用matplotlib ...

 import numpy as np
 import matplotlib.pyplot as plt

 SampleData=(375-367)*np.random.random_sample((365, 50))+367
 SDist=np.zeros((365,11))
 for i in range(11):
     for t in range(365):
         SDist[t,i]=np.percentile(SampleData[t,:],i*10)

 fig, (ax1) = plt.subplots(nrows=1, ncols=1, sharex=True, figsize=(8,4))
 ax1.plot(np.arange(0,365,1), SDist)
 ax1.set_title("SampleData", fontsize=15)
 ax1.tick_params(labelsize=11.5)
 ax1.set_xlabel('Day', fontsize=14)
 ax1.set_ylabel('SampleData', fontsize=14)
 fig.tight_layout()

显示百分位线的示例数据

编辑

这是我想要做的一个很好的例子(尽管显然它与我的示例数据看起来不同) - 我认为它类似于风扇图表:

用于定义颜色渐变的百分位数

4

2 回答 2

3

您可以使用 matplotlib cm 对象获取颜色图并根据值手动计算要绘制的颜色。下面的示例根据线索引 (0-11) 计算要绘制的颜色。但是,您可以根据任何东西计算颜色,例如用于计算百分位数的观察次数,只要您单独绘制它们并调用正确的颜色值。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

n = 11 # change this value for the number of iterations/percentiles
colormap = cm.Blues # change this for the colormap of choice
percentiles = np.linspace(0,100,n)

SampleData=(375-367)*np.random.random_sample((365, 50))+367
SDist=np.zeros((365,n))
for i in range(n):
    for t in range(365):
      SDist[t,i]=np.percentile(SampleData[t,:],percentiles[i])

half = int((n-1)/2)

fig, (ax1) = plt.subplots(nrows=1, ncols=1, sharex=True, figsize=(8,4))
ax1.plot(np.arange(0,365,1), SDist[:,half],color='k')
for i in range(half):
    ax1.fill_between(np.arange(0,365,1), SDist[:,i],SDist[:,-(i+1)],color=colormap(i/half))

ax1.set_title("SampleData", fontsize=15)
ax1.tick_params(labelsize=11.5)
ax1.set_xlabel('Day', fontsize=14)
ax1.set_ylabel('SampleData', fontsize=14)
fig.tight_layout()

结果应如下所示:

于 2018-10-30T20:14:02.743 回答
1

fill_between 最终解决了问题:

 import numpy as np
 import matplotlib.pyplot as plt

 SampleData=(375-367)*np.random.random_sample((365, 50))+367
 SDist=np.zeros((365,11))
 for i in range(11):
     for t in range(365):
         SDist[t,i]=np.percentile(SampleData[t,:],i*10)
 x=np.arange(0,365,1)

 fig, (ax1) = plt.subplots(nrows=1, ncols=1, sharex=True, figsize=(8,4))
 ax1.set_color_cycle(['red'])
 ax1.plot(x, SDist[:,5])
 for i in range(6):
     alph=0.05+(i/10.)
     ax1.fill_between(x, SDist[:,0+i], SDist[:,10-i], color="red", alpha=alph)
 ax1.set_title("SampleData", fontsize=15)
 ax1.tick_params(labelsize=11.5)
 ax1.set_xlabel('Day', fontsize=14)
 ax1.set_ylabel('SampleData', fontsize=14)
 fig.tight_layout()

使用填充之间的百分位时间序列

于 2018-10-30T20:27:23.943 回答