python - 如何强制 Altair 在特定轴上订购热图(矩形)?
问题描述
我正在尝试在 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 轴类别的排序顺序,可以使用sort
y 编码的属性。例如:
# 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 图表中数据的顺序。
推荐阅读
- javascript - 如何在代码(node.js)中处理“进程内存不足后返回的 API 致命错误处理程序”?
- javascript - 在执行上下文的创建阶段如何加载 javascript 对象和 javascript 函数?
- ios - 如何在 iOS 中创建一个旋转的彩虹色圈
- php - ErrorException (E_WARNING) 非法字符串偏移 'customerid'
- mysql - 元数据库中的本机和 SQL 查询
- spring-boot - 无法从 Kubernetes 中的另一个服务访问 Spring Boot 后端服务
- html - 在创建 div 时使 Loading div 可访问
- python - 正切 x 的反正切没有精确计算
- node.js - .gitignore 如何忽略文件夹而不是子文件夹
- http - 在 Tcl 中使用 http::geturl 的文件上传问题包含 http-2.9 包