Использование процентилей временных рядов для установки градиента цвета в matplotlib Python - PullRequest
0 голосов
/ 30 октября 2018

У меня есть временной ряд, который будет иметь более 10000 ежедневных значений переменной в течение года, размер массива (365, 10000). Поскольку у меня будет так много данных (много временных рядов для многих переменных), я надеялся сохранить только процентили (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()

Sample Data showing Percentile Lines

РЕДАКТИРОВАТЬ

Вот хороший пример того, к чему я стремлюсь (хотя, очевидно, это будет выглядеть иначе с моими примерами данных) - я думаю, что это похоже на диаграмму поклонников:

Percentiles used to define colour gradients

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

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()

Percentiles time series using fill between

0 голосов
/ 30 октября 2018

Вы можете использовать объект cm 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()

Результат должен выглядеть так:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...