Python hvplot.heatmap with pandas dataframe:如何指定值维度?

Python hvplot.heatmap with pandas dataframe:如何指定值维度?,python,pandas,bokeh,holoviews,hvplot,Python,Pandas,Bokeh,Holoviews,Hvplot,我有一个包含列和行的简单数据框,我想使用hvpolot.heatmap将其可视化。 我可以做一些非常类似的事情: df.style.background\u梯度(cmap='summer') 。。在Jupyter,看起来像: 数据帧非常简单: >df.index 索引(['ackerland','friedhof','gartenland','gehoelz','golfplatz',', 格伦兰德、海德、克莱因加滕、劳布霍尔兹、米歇尔兹、摩尔、, “nadelholz”], dtype='

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

df.style.background\u梯度(cmap='summer')
。。在Jupyter,看起来像:

数据帧非常简单:

>df.index
索引(['ackerland','friedhof','gartenland','gehoelz','golfplatz',',
格伦兰德、海德、克莱因加滕、劳布霍尔兹、米歇尔兹、摩尔、,
“nadelholz”],
dtype='object')
>df.columns
索引([‘远足’、‘骑自行车’、‘散步’、‘运动’、‘朋友’、‘家人’、‘野餐’],dtype='object')
但当我这样做的时候:

>导入hvplot.pandas
>df.hvplot.heatmap(colorbar=True)
ValueError:维度必须定义为元组、字符串、字典或维度实例,如果找到的是非类型类型```
这也不起作用:

df.hvplot.heatmap(x=df.index,y=df.columns,colorbar=True) ValueError:索引的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。 我已经阅读了有关这方面的大多数文档,但仍然不完全理解如何在hvplot/holoviews/bokeh中为pandas数据帧指定值维度:

[编辑]添加了

1)如果您的数据采用的是宽幅格式,类别作为索引,列作为值,如下所示:

+--------------------------+
|         colA  colB  colC |
+--------------------------+
| group1    10 5.000 1.200 |
| group2    12 3.000 4.500 |
| group3    14 1.200 2.300 |
+--------------------------+
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)
+------------------------------+
|      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_melt = df.melt(id_vars='group')
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>=0.5执行
df.heatmap.hvplot()

+--------------------------+
|         colA  colB  colC |
+--------------------------+
| group1    10 5.000 1.200 |
| group2    12 3.000 4.500 |
| group3    14 1.200 2.300 |
+--------------------------+
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)
+------------------------------+
|      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_melt = df.melt(id_vars='group')
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)
如果要向热图添加数据标签,可以执行以下操作:

+--------------------------+
|         colA  colB  colC |
+--------------------------+
| group1    10 5.000 1.200 |
| group2    12 3.000 4.500 |
| group3    14 1.200 2.300 |
+--------------------------+
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)
+------------------------------+
|      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_melt = df.melt(id_vars='group')
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)


2)但是,如果您的数据是这样的,组只是另一列,而不是索引:

+--------------------------+
|         colA  colB  colC |
+--------------------------+
| group1    10 5.000 1.200 |
| group2    12 3.000 4.500 |
| group3    14 1.200 2.300 |
+--------------------------+
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)
+------------------------------+
|      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_melt = df.melt(id_vars='group')
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)
然后您可以使用
df.set_index('group')
(并应用解决方案1)将组设置为索引,或者将数据设置为长格式:

+--------------------------+
|         colA  colB  colC |
+--------------------------+
| group1    10 5.000 1.200 |
| group2    12 3.000 4.500 |
| group3    14 1.200 2.300 |
+--------------------------+
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)
+------------------------------+
|      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_melt = df.melt(id_vars='group')
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)
熔化数据后,如下所示:

+---+--------+----------+--------+
|   | 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')
hv.HeatMap(df_melt, kdims=['group', 'variable'], vdims=['value'])
或者您可以使用熔化(长)数据在HoloView中创建热图

df_melt.hvplot.heatmap(x='group', y='variable', C='value')
hv.HeatMap(df_melt, kdims=['group', 'variable'], vdims=['value'])
融化数据的优点是,您现在还可以轻松地将数据标签添加到热图中:

+--------------------------+
|         colA  colB  colC |
+--------------------------+
| group1    10 5.000 1.200 |
| group2    12 3.000 4.500 |
| group3    14 1.200 2.300 |
+--------------------------+
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)
+------------------------------+
|      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_melt = df.melt(id_vars='group')
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)
向热图添加数据标签/值的另一种(甚至)更简单的方法如下:

+--------------------------+
|         colA  colB  colC |
+--------------------------+
| group1    10 5.000 1.200 |
| group2    12 3.000 4.500 |
| group3    14 1.200 2.300 |
+--------------------------+
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)
+------------------------------+
|      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_melt = df.melt(id_vars='group')
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)


结果图:

+--------------------------+
|         colA  colB  colC |
+--------------------------+
| group1    10 5.000 1.200 |
| group2    12 3.000 4.500 |
| group3    14 1.200 2.300 |
+--------------------------+
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)
+------------------------------+
|      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_melt = df.melt(id_vars='group')
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中热图的更多信息:

有关HoloView中热图的更多信息:

有关HoloView中(数据)标签的更多信息:

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

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

我甚至发现了如何在holoviews中绘制这个:
hv.HeatMap({'x':df.columns,'y':df.index,'z':df},['x','y'],'z')
但是同样的语法在hvplot中不起作用谢谢Alex,你能提出一个问题要求我们在hvplot中支持它吗?谢谢philippjfr!当然,我会尽快报告(同时,很抱歉问了两次-您已经向我解释过一次如何指定值维度,我很尴尬地意识到这一点)非常感谢,我不知道df.melt可以在这里应用,期待着尝试。很好的解释!