如何强制 Altair 在特定轴上订购热图(矩形)?
How to force Altair to order heatmap(rect) on a specific axis?
我正在尝试在 Altair 中创建集群热图。创建热图效果很好,但我无法根据另一列的值对行重新排序。
这是我用来使用 seaborn 创建热图的代码片段:
import pandas as pd
import numpy as np
import seaborn as sns
import altair as alt
import random
iris = sns.load_dataset("iris")
species = iris.pop("species")
# Clustermap for rows only
g = sns.clustermap(iris, col_cluster=False, cmap="magma")
# Get the reodered indices
reordered_indices = g.dendrogram_row.reordered_ind
# Create a dictionary to add this information to the longform dataframe later
reordering_dict = pd.Series(reordered_indices, index=iris.index.values).to_dict()
# Converting iris to tidyform
iris.reset_index(level=0, inplace=True)
iris_tidy = pd.melt(iris, id_vars=["index"], var_name="Paramaeter", value_name="value")
# Adding the ordering information
iris_tidy['order'] = iris_tidy['index'].map(reordering_dict)
结果是:
现在使用 Altair 进行相同的尝试:
# Plotting using Altair
alt.Chart(iris_tidy, width=500, height=500).mark_rect().encode(
alt.X("Paramaeter:N", bin=False, sort=None),
alt.Y("order:O", bin=False),
alt.Color("value:Q", scale=alt.Scale(scheme="magma")),
order=alt.Order("order:Q", sort="ascending"),
).configure_scale(bandPaddingInner=0).configure_view(strokeOpacity=0, stroke="transparent").configure_axisY(
labels=False, ticks=False
).configure_axisX(
labelAngle=0, ticks=False
)
给我这个:
我认为我使用 alt.order() 不正确。我假设这样做的一种方法是使用序数列 order
本身来定义 Y 轴 - 但我会松开与 index
关联的标签。
如果想控制Y轴分类的排序顺序,可以使用y编码的sort
属性。例如:
# Plotting using Altair
alt.Chart(iris_tidy, width=500, height=500).mark_rect().encode(
alt.X("Paramaeter:N", bin=False, sort=None),
alt.Y("index:O", sort=alt.EncodingSortField(field='order', order='ascending')),
alt.Color("value:Q", scale=alt.Scale(scheme="magma")),
).configure_scale(bandPaddingInner=0).configure_view(strokeOpacity=0, stroke="transparent")
这与 seaborn 输出不匹配,但我认为这是因为计算的 order
列没有反映 seaborn 图表中数据的顺序。
我正在尝试在 Altair 中创建集群热图。创建热图效果很好,但我无法根据另一列的值对行重新排序。
这是我用来使用 seaborn 创建热图的代码片段:
import pandas as pd
import numpy as np
import seaborn as sns
import altair as alt
import random
iris = sns.load_dataset("iris")
species = iris.pop("species")
# Clustermap for rows only
g = sns.clustermap(iris, col_cluster=False, cmap="magma")
# Get the reodered indices
reordered_indices = g.dendrogram_row.reordered_ind
# Create a dictionary to add this information to the longform dataframe later
reordering_dict = pd.Series(reordered_indices, index=iris.index.values).to_dict()
# Converting iris to tidyform
iris.reset_index(level=0, inplace=True)
iris_tidy = pd.melt(iris, id_vars=["index"], var_name="Paramaeter", value_name="value")
# Adding the ordering information
iris_tidy['order'] = iris_tidy['index'].map(reordering_dict)
结果是:
现在使用 Altair 进行相同的尝试:
# Plotting using Altair
alt.Chart(iris_tidy, width=500, height=500).mark_rect().encode(
alt.X("Paramaeter:N", bin=False, sort=None),
alt.Y("order:O", bin=False),
alt.Color("value:Q", scale=alt.Scale(scheme="magma")),
order=alt.Order("order:Q", sort="ascending"),
).configure_scale(bandPaddingInner=0).configure_view(strokeOpacity=0, stroke="transparent").configure_axisY(
labels=False, ticks=False
).configure_axisX(
labelAngle=0, ticks=False
)
给我这个:
我认为我使用 alt.order() 不正确。我假设这样做的一种方法是使用序数列 order
本身来定义 Y 轴 - 但我会松开与 index
关联的标签。
如果想控制Y轴分类的排序顺序,可以使用y编码的sort
属性。例如:
# Plotting using Altair
alt.Chart(iris_tidy, width=500, height=500).mark_rect().encode(
alt.X("Paramaeter:N", bin=False, sort=None),
alt.Y("index:O", sort=alt.EncodingSortField(field='order', order='ascending')),
alt.Color("value:Q", scale=alt.Scale(scheme="magma")),
).configure_scale(bandPaddingInner=0).configure_view(strokeOpacity=0, stroke="transparent")
这与 seaborn 输出不匹配,但我认为这是因为计算的 order
列没有反映 seaborn 图表中数据的顺序。