4

我有一个简单的数据框,其中包含我想使用 hvpolot.heatmap 可视化的列和行。我可以做一些非常相似的事情:

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

我已经阅读了大多数关于此的文档,但仍然不完全了解如何在 hvplot/holoviews/bokeh 中为 pandas 数据框指定值维度:

[编辑] 添加功能请求

4

2 回答 2

7

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

于 2020-01-18T20:45:22.340 回答
1

对于您想要的,您可以执行以下操作:

df.hvplot.heatmap(x='index', y='columns', colorbar=True)
于 2021-02-19T17:43:23.530 回答