hvplot.heatmap with pandas dataframe:如何指定值维度?
hvplot.heatmap with pandas dataframe: How to specify value dimensions?
我有一个包含列和行的简单数据框,我想使用 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 数据框指定值维度
- Bokeh Heatmap Doc
- Pandas Dataframe Plot Doc
- hvplot plot doc
- hvplot intro with pd.df
- oloviews heatmap doc
[编辑] 添加了 feature request
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),或者 melt 您的数据为长格式:
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
有关全息视图中热图的更多信息:
https://holoviews.org/reference/elements/bokeh/HeatMap.html
有关全息视图中(数据)标签的更多信息:
https://holoviews.org/reference/elements/bokeh/Labels.html
想做就做:
df.hvplot.heatmap(x='index', y='columns', colorbar=True)
我有一个包含列和行的简单数据框,我想使用 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 数据框指定值维度- Bokeh Heatmap Doc
- Pandas Dataframe Plot Doc
- hvplot plot doc
- hvplot intro with pd.df
- oloviews heatmap doc
[编辑] 添加了 feature request
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),或者 melt 您的数据为长格式:
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
有关全息视图中热图的更多信息:
https://holoviews.org/reference/elements/bokeh/HeatMap.html
有关全息视图中(数据)标签的更多信息:
https://holoviews.org/reference/elements/bokeh/Labels.html
想做就做:
df.hvplot.heatmap(x='index', y='columns', colorbar=True)