hvplot.тепловая карта с фреймом данных pandas: как указать размеры значения?

#python #pandas #bokeh #holoviews #hvplot

#python #pandas #боке #видеообзоры #hvplot

Вопрос:

У меня есть простой фрейм данных со столбцами и строками, которые я хочу визуализировать с помощью hvpolot.тепловая карта. Я могу сделать что-то очень похожее с:

 df.style.background_gradient(cmap='summer')
  

.. в Jupyter выглядит так:
введите описание изображения здесь

Фрейм данных довольно прост:

 > df.index
Index(['ackerland', 'friedhof', 'gartenland', 'gehoelz', 'golfplatz',
       'gruenland', 'heide', 'kleingarten', 'laubholz', 'mischholz', 'moor',
       'nadelholz'],
      dtype='object')
> df.columns
Index(['hiking', 'biking', 'walking', 'sport', 'friends', 'family', 'picnic'], dtype='object')
  

Но когда я делаю:

 >import hvplot.pandas
>df.hvplot.heatmap(colorbar=True)
ValueError: Dimensions must be defined as a tuple, string, dictionary or Dimension instance, found a NoneType type.```
  

Это также не работает:

 >df.hvplot.heatmap(x=df.index, y=df.columns, colorbar=True)
ValueError: The truth value of a Index is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
  

Я прочитал большинство документов, касающихся этого, но все еще не до конца понимаю, как указать размеры значений для фрейма данных pandas в hvplot / holoviews / bokeh:

[править] Добавлен запрос функции

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

1. Я даже узнал, как отобразить это в holoviews: hv.HeatMap({'x': df.columns, 'y':df.index, 'z': df}, ['x', 'y'], 'z') но тот же синтаксис не работает в hvplot

2. Спасибо, Алекс, не могли бы вы сообщить о проблеме, чтобы попросить нас поддержать это в hvplot?

3. Спасибо philippjfr! Конечно, я сообщу об этом как можно скорее (также, извините, что спрашиваю дважды — вы уже однажды объяснили мне, как указать размеры значения, я смущен, осознавая это)

Ответ №1:

1) Если ваши данные представлены в широкоформатном формате, который у вас есть, с категориями в качестве индекса и столбцами в качестве значений, вот так:

  -------------------------- 
|         colA  colB  colC |
 -------------------------- 
| group1    10 5.000 1.200 |
| group2    12 3.000 4.500 |
| group3    14 1.200 2.300 |
 -------------------------- 
  

Тогда вы просто делаете df.heatmap.hvplot() с hvplot >= 0.5:

 import pandas as pd
import holoviews as hv
import hvplot.pandas
hv.extension('bokeh')

df = pd.DataFrame({
    'colA': [10, 12, 14],
    'colB': [5, 3.0, 1.2],
    'colC': [1.2, 4.5, 2.3]},
    index=['group1', 'group2', 'group3'],
)

df.hvplot.heatmap()
  

Если вы хотите добавить метки данных к тепловой карте, вы можете сделать:

 heatmap = df.hvplot.heatmap()

heatmap * hv.Labels(heatmap)
  

2) Однако, когда ваши данные похожи на эти, где группы — это просто еще один столбец, а не индекс:

  ------------------------------ 
|      group colA  colB  colC  |
 ------------------------------ 
| 1   group1    10 5.000 1.200 |
| 2   group2    12 3.000 4.500 |
| 3   group3    14 1.200 2.300 |
 ------------------------------ 
  

Затем вы могли бы либо установить свою группу в качестве индекса с помощью df.set_index('group') (и применить решение 1), либо преобразовать свои данные в длинный формат:

 df_melt = df.melt(id_vars='group')
  

После расплавления ваши данные выглядят следующим образом:

  --- -------- ---------- -------- 
|   | group  | variable | value  |
 --- -------- ---------- -------- 
| 0 | group1 | colA     | 10.000 |
| 1 | group2 | colA     | 12.000 |
| 2 | group3 | colA     | 14.000 |
| 3 | group1 | colB     | 5.000  |
| 4 | group2 | colB     | 3.000  |
 --- -------- ---------- -------- 
  

Эти расплавленные данные представлены в формате, в котором вы можете использовать ключевые слова x, y и C:

 df_melt.hvplot.heatmap(x='group', y='variable', C='value')
  

Или вы можете использовать эти расплавленные (длинные) данные для создания тепловой карты в HoloViews:

 hv.HeatMap(df_melt, kdims=['group', 'variable'], vdims=['value'])
  

Преимущество расплавленных данных в том, что теперь вы также можете легко добавлять метки данных к своей тепловой карте:

 heatmap = df_melt.hvplot.heatmap(x='group', y='variable', C='value')
labels = hv.Labels(data=df_melt, kdims=['group', 'variable'], vdims=['value'])

heatmap * labels
  

Другой (даже) более простой способ добавить метки данных / значения в вашу тепловую карту выглядит следующим образом:

 heatmap = df_melt.hvplot.heatmap(x='group', y='variable', C='value')
heatmap * hv.Labels(heatmap)
  

Результирующий график:

хорошая тепловая карта с метками с использованием hvplot или holoviews

Больше информации о тепловых картах в hvplot:
https://hvplot.holoviz.org/reference/pandas/heatmap.html

Больше информации о тепловых картах в holoviews:
https://holoviews.org/reference/elements/bokeh/HeatMap.html

Дополнительная информация о метках (данных) в holoviews:
https://holoviews.org/reference/elements/bokeh/Labels.html

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

1. Большое спасибо, я не знал, что df.melt может быть применен здесь, с нетерпением жду возможности попробовать это. Отличное объяснение!

Ответ №2:

Для того, что вы хотите, вы можете сделать :

 df.hvplot.heatmap(x='index', y='columns', colorbar=True)