Использование отдельных шкал для каждой группы в сгруппированных и сложенных гистограммах в Альтаире - PullRequest
1 голос
/ 29 апреля 2020

Я бы хотел использовать отдельные шкалы для каждой группы в сгруппированном и сложенном барплоте, используя Altair в Python.

Так, например, вместо следующих

enter image description here

Я бы хотел что-то похожее на следующее. На этом (Gimp-) отредактированном снимке у меня одинаковая шкала для всех 4 групп A, B, C и D. Но в моих реальных данных порядки величин отличаются от группы к другой. Поэтому у каждой группы должен быть свой масштаб. Любые идеи о том, как это сделать?

enter image description here

Вот минимальный пример из ЗДЕСЬ

import pandas as pd
import numpy as np
import altair as alt

df1=pd.DataFrame(10*np.random.rand(4,3),index=["A","B","C","D"],columns=["I","J","K"])
df2=pd.DataFrame(10*np.random.rand(4,3),index=["A","B","C","D"],columns=["I","J","K"])
df3=pd.DataFrame(10*np.random.rand(4,3),index=["A","B","C","D"],columns=["I","J","K"])

def prep_df(df, name):
    df = df.stack().reset_index()
    df.columns = ['c1', 'c2', 'values']
    df['DF'] = name
    return df

df1 = prep_df(df1, 'DF1')
df2 = prep_df(df2, 'DF2')
df3 = prep_df(df3, 'DF3')

df = pd.concat([df1, df2, df3])

chart = alt.Chart(df).mark_bar().encode(
    x=alt.X('c2:N', title=None),
    y=alt.Y('sum(values):Q', axis=alt.Axis(grid=False, title=None)),
    column=alt.Column('c1:N', title=None),
    color=alt.Color('DF:N', scale=alt.Scale(range=['#96ceb4', '#ffcc5c','#ff6f69']))
).configure_view(
    strokeOpacity=0    
)

chart.save("Power.svg")

1 Ответ

1 голос
/ 29 апреля 2020

Вы можете иметь независимые оси для диаграмм, добавив

resolve_scale(y='independent')

Обратите внимание, что само по себе это позволяет пределам y-домена для каждого фасета корректироваться в соответствии с подмножеством данных в каждом фасете; вы можете сделать так, чтобы они совпадали, явно указав пределы домена.

В совокупности это выглядит так:

alt.Chart(df).mark_bar().encode(
    x=alt.X('c2:N', title=None),
    y=alt.Y('sum(values):Q', axis=alt.Axis(grid=False, title=None), scale=alt.Scale(domain=[0, 25])),
    column=alt.Column('c1:N', title=None),
    color=alt.Color('DF:N', scale=alt.Scale(range=['#96ceb4', '#ffcc5c','#ff6f69']))
).configure_view(
    strokeOpacity=0    
).resolve_scale(
    y='independent'
)

enter image description here

...