Гистограмма Альтаира - независимые шкалы - PullRequest
1 голос
/ 25 марта 2020

Предположим, у меня есть набор данных, в котором переменные могут масштабироваться совершенно по-разному. Я хочу создать гистограммы для каждой из числовых переменных c. Я пытаюсь сделать шкалы x и y независимыми друг от друга, чтобы шкалы не влияли на качество изображения. Но даже когда я использую resolve_scale(), это только делает шкалу y независимой, в то время как x все еще распространен среди всех переменных. Это видно из рисунка ниже, который можно получить, применив код. Это желаемое поведение или я что-то упускаю?

Мой вопрос:
1. Как я могу сделать независимой шкалу х?
2. Как сделать так, чтобы заголовок был ближе к сюжет?

Спасибо за помощь.

версия: python Альтаир 4.0

alt.__version__
'4.0.1'
import altair as alt

data = alt.datasets.load_dataset('flights-2k')
chosen_origin_airports = data.groupby('origin').size().sort_values(ascending=False).head(12).index.tolist()
data = data[data.origin.isin(chosen_origin_airports)]
data.loc[data.origin=='BWI', 'delay']  = data.loc[data.origin=='BWI', 'delay'] * (10000)

alt.Chart(data=data).mark_bar().encode(
    x = alt.X('delay:Q', 
              axis=alt.Axis(title=''), 
              scale=alt.Scale(zero=False),
              bin=alt.Bin(maxbins=20)),
    y = alt.Y('count():Q', 
              axis=alt.Axis(title='')),
    color = alt.Color('origin:N')
).properties(
    width=130,
    height=130
).facet(
    alt.Column('origin:N', sort = alt.EncodingSortField(order=None)),
    align= 'all',
    padding=0,
    columns=4,
    spacing=0
).properties(
    title=''
).configure_title(
    fontSize=20,
    font='Courier',
    anchor='middle',
    color='gray',
    align='left'
).configure_header(
    title=None,
    titleColor='green',
    titleFontSize=14,
    labelColor='forestgreen',
    labelFontSize=14
).resolve_axis(
    x='independent',
    y='independent'
).resolve_scale(
    x='independent', 
    y='independent'
)

facetted histogram

1 Ответ

1 голос
/ 25 марта 2020

Ваши весы независимы, но ваши привязки - нет. К сожалению, грамматика Vega-Lite не позволяет легко определить преобразование бина, которое применяет различные параметры бина к различным подмножествам данных, поэтому вам придется вручную использовать отдельное преобразование бина для каждой панели диаграммы.

Я бы, наверное, сделал что-то вроде этого:

chart = alt.Chart(data).mark_bar().encode(
    x = alt.X('delay:Q', 
              axis=alt.Axis(title=''), 
              scale=alt.Scale(zero=False),
              bin=alt.Bin(maxbins=20)),
    y = alt.Y('count():Q', 
              axis=alt.Axis(title='')),
    color = alt.Color('origin:N')
).properties(
    width=130,
    height=130
)

alt.ConcatChart(
    concat=[
      chart.transform_filter(alt.datum.origin == value).properties(title=value)
      for value in sorted(data.origin.unique())
    ],
    columns=4
).configure_title(
    fontSize=20,
    font='Courier',
    anchor='middle',
    color='gray',
    align='left'
).resolve_axis(
    x='independent',
    y='independent'
).resolve_scale(
    x='independent', 
    y='independent'
)

enter image description here

...