Временные ряды с несколькими цветами и условными обозначениями с использованием Datashader и Holoviews

#python #data-visualization #holoviews #datashader

#python #визуализация данных #holoviews #datashader

Вопрос:

Я хотел бы построить фрейм данных временных рядов с 3 столбцами, по одному для каждой кривой. Я бы хотел, чтобы каждая кривая имела свой собственный цвет, а также отображала легенду, как hvplot() и по умолчанию.

Вот автономный пример:

 import numpy as np
import pandas as pd
import hvplot.pandas
import datetime
from holoviews.operation.datashader import datashade

n=1000
start = datetime.datetime(2010, 10, 1, 0)   # Start time
datetimerange = [start   datetime.timedelta(minutes=1)*i for i in range(n)]
A = np.random.randint(5, size=n)
B = np.random.randint(20, 40, size=n)
C = np.random.randint(10, 20, size=n)
d = {'datetime': datetimerange, 'A': A, 'B': B, 'C': C}
df = pd.DataFrame(d).set_index('datetime')

df.hvplot(cmap=['red', 'blue', 'green'])   datashade(df.hvplot(cmap=['red', 'blue', 'green']))
  

Вот результат (без datashader слева, с datashader справа):

введите описание изображения здесь

При передаче графика в datashader цвета и легенда теряются. Использование datashade=True аргумента of hvplot дает тот же результат.

В документации Datashader есть руководство по построению временных рядов, но оно довольно сложное, оно используется datashader.transfer_functions.shade() в качестве основы для управления графиками без особого представления о том, как это работает, и API не намного понятнее. Я просто хотел бы сохранить эти основные функции графика, которые bokeh / hvplot предоставляет по умолчанию, я не уверен, почему datashader их не сохраняет, поэтому я не знаю, что исправить.

Как я могу подать сигнал datashader, чтобы сохранить разные цвета и построить легенду?

Комментарии:

1. возможно, вы также можете задать вопрос о discourse.holoviz.org Здесь разработчики пакета также отвечают на вопросы. Если у них есть лучший ответ, можете ли вы также опубликовать его здесь? Мне тоже любопытно 🙂

Ответ №1:

Вот половина ответа, к сожалению, это не дает легенды. Пожалуйста, обратите внимание, что .hvplot() аргумент datashade=True встроен:

 df.reset_index().melt(id_vars='datetime').hvplot.line(
    x='datetime', 
    y='value', 
    by='variable', 
    datashade=True, 
    dynamic=False,
)
  

Комментарии:

1. Это решение hvplot не окрашивает группы по-разному. Это ошибка или неправильное использование аргументов hvplot?

2. @fmfreeze: я написал, что дал половину ответа, поэтому я не знал, как это решить. Но лучший ответ на этот вопрос можно найти здесь: discourse.holoviz.org/t /…

3. @SandervandenOord Спасибо вам большое, очень большое! Я принял ваш ответ в качестве ссылки на ваш комментарий к полному ответу, не могли бы вы добавить его в качестве дополнения к вашему ответу, пожалуйста?