#python #pandas #bokeh #holoviews #hvplot
#python #pandas #боке #видеообзоры #hvplot
Вопрос:
У меня есть простой фрейм данных со столбцами и строками, которые я хочу визуализировать с помощью hvpolot.тепловая карта. Я могу сделать что-то очень похожее с:
df.style.background_gradient(cmap='summer')
Фрейм данных довольно прост:
> 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:
- Тепловая карта Боке, документ
- Документ о графике фрейма данных Pandas
- документ hvplot plot
- вводная часть hvplot с pd.df
- oloviews heatmap doc
[править] Добавлен запрос функции
Комментарии:
1. Я даже узнал, как отобразить это в holoviews:
hv.HeatMap({'x': df.columns, 'y':df.index, 'z': df}, ['x', 'y'], 'z')
но тот же синтаксис не работает в hvplot2. Спасибо, Алекс, не могли бы вы сообщить о проблеме, чтобы попросить нас поддержать это в 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:
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)