python - 使用时间序列的百分位数在 Python 的 matplotlib 中设置颜色渐变
问题描述
我有一个时间序列,在一年数组大小(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()
编辑
这是我想要做的一个很好的例子(尽管显然它与我的示例数据看起来不同) - 我认为它类似于风扇图表:
解决方案
您可以使用 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()
结果应如下所示:
推荐阅读
- c++ - C/C++ 宏从类型定义中定义类型
- java - 使用 Criteria API 获取并发表
- dataset - 为数据重组创建日期索引
- verilog - 为什么 $display 函数不打印任何值?
- python-3.x - 我正在根据一些公式编写代码;但我的 if 语句似乎不起作用(第 33 行)
- css - 如何以 CSS 样式添加具有变量值的类名?
- python - 在 64 位机器上强制 VirtualAlloc 地址小于 32 位
- c# - 如何更改 Android 模拟器(ldplayer、noxplayer 等)启动动画
- javascript - 如何在本机反应中更改数组键名
- sql - 子查询结构问题