Как заставить Альтаира заказывать тепловую карту (прямоугольник) на определенной оси?

Я пытаюсь создать кластерную тепловую карту в Альтаире. Создание тепловой карты работает нормально, но я не могу изменить порядок строк в зависимости от значения другого столбца.

Вот фрагмент кода, который я использую для создания тепловой карты с помощью 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)

и это приводит к следующему:  Карта кластеризации с использованием морского пути

Теперь, пытаясь сделать то же самое с Альтаиром:

# 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
)

дает мне это:  Тепловая карта с использованием altair

Я считаю, что использую alt.order () неправильно. Я предполагаю, что одним из способов сделать это будет использование самого порядкового столбца order для определения оси Y, но я потеряю метки, связанные с index.


person Siddharth    schedule 29.04.2019    source источник
comment
Если ваш столбец порядка отражает порядок, в котором значения отображаются в Seaborn, то установка y = 'order: O' расставит цвета в правильном порядке. Это не так, что заставляет меня думать, что столбец заказа указан неправильно. Я бы сначала поработал над тем, чтобы исправить это, прежде чем беспокоиться о метках осей.   -  person jakevdp    schedule 29.04.2019


Ответы (1)


Если вы хотите управлять порядком сортировки категорий оси 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")

введите здесь описание изображения

Это не соответствует выходным данным морского наблюдения, но я считаю, что это связано с тем, что вычисленный столбец order не отражает порядок данных в морской диаграмме.

person jakevdp    schedule 29.04.2019
comment
Спасибо за ответ. Если я переставлю фрейм данных и построю его с помощью matplotlib imshow, я все равно получу точно такой же график, что и Seaborn (который, как мне кажется, подтверждает, что сам порядок не является проблемой) - i.imgur.com/am0yiIy.png (извините за соотношение сторон) - person Siddharth; 30.04.2019
comment
Я пробовал sort на других наборах данных, и он работает безупречно. Может быть, в этом случае это связано с интерполяцией в seaborn / imshow, из-за которой результаты выглядят иначе? - person Siddharth; 07.05.2019