цветовая карта с функцией построения графиков панд - PullRequest
0 голосов
/ 13 мая 2018

У меня есть данные с нескольких сайтов, которые фиксируют резкое изменение контролируемого параметра.Как я могу построить данные для всех этих сайтов, используя цветозависимые цвета, чтобы улучшить визуализацию?

import numpy as np
import pandas as pd
import string

# site names
cols = string.ascii_uppercase

# number of days
ndays = 3

# index
index = pd.date_range('2018-05-01', periods=3*24*60, freq='T')

# simulated daily data
d1 = np.random.randn(len(index)//ndays, len(cols))
d2 = np.random.randn(len(index)//ndays, len(cols))+2
d3 = np.random.randn(len(index)//ndays, len(cols))-2
data=np.concatenate([d1, d2, d3]) 

# df = pd.DataFrame(data=data, index=index, columns=list(cols))
df.plot(legend=False)

Каждому сайту (столбцу) присваивается один цвет в приведенном выше коде.Есть ли способ представления значений параметров для разных цветов?

Я полагаю, что одна альтернатива - это использование цветовых карт из функции точечного графика: Как использовать цветовые карты для цветных графиков Pandas DataFrames

ax = plt.subplots(figsize=(12,6))
collection = [plt.scatter(range(len(df)), df[col], c=df[col], s=25, cmap=cmap, edgecolor='None') for col in df.columns]

Однако, если я строю графики с течением времени (то есть, x=df.index), вещи, кажется, работают не так, как ожидалось.

Есть ли другая альтернатива?или предложение как лучше визуализировать внезапное изменение во временных рядах?

1 Ответ

0 голосов
/ 14 мая 2018

В дальнейшем я буду использовать только 3 столбца и почасовые данные, чтобы графики выглядели менее беспорядочно.Примеры работают также с исходными данными.

cols = string.ascii_uppercase[:3]
ndays = 3
index = pd.date_range('2018-05-01', periods=3*24, freq='H')

# simulated daily data
d1 = np.random.randn(len(index)//ndays, len(cols))
d2 = np.random.randn(len(index)//ndays, len(cols))+2
d3 = np.random.randn(len(index)//ndays, len(cols))-2
data=np.concatenate([d1, d2, d3]) 

df = pd.DataFrame(data=data, index=index, columns=list(cols))
df.plot(legend=False)

enter image description here

Способ панд

Вам не повезло, DataFrame.plot.scatter не работает с данными, похожими на дату и время, из-за давней ошибки .

Matplotlib

Matplotlib scatter может обрабатывать данные, подобные дате и времени, ноОсь X не масштабируется, как ожидалось.

for col in df.columns:
    plt.scatter(df.index, df[col], c=df[col])
plt.gcf().autofmt_xdate()

enter image description here

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

for col in df.columns:
    plt.scatter(df.index, df[col], c=df[col])

start, end = df.index[[0, -1]]
xmargin = (end - start) * plt.gca().margins()[0]
plt.xlim(start - xmargin, end + xmargin)
plt.gcf().autofmt_xdate()

enter image description here

К сожалению, форматер оси X не так хорош, как пандыone.

Панда, пересмотренный

Я обнаружил этот трюк случайно, и я не понимаю, почему он работает.Если вы строите серию панд, проиндексированных по тем же данным даты и времени, перед вызовом scatter в matplotlib, проблема автоматического масштабирования исчезает, и вы получаете хорошее форматирование панд.

Итак, я сделал невидимый график для первого столбца, а затемточечная диаграмма.

df.iloc[:, 0].plot(lw=0)  # invisible plot
for col in df.columns:
    plt.scatter(df.index, df[col], c=df[col])

enter image description here

...