Как добавить вторую ось Y к гистограмме? Альтаир

У меня есть DataFrame:

  EMOJI   PERCENT_TEXT    PERCENT     combined
0  ????         23.1%        23.1       ???? 23.1%
1  ????         5.7%          5.7       ???? 5.7% 
2  ????         3.5%          3.5       ???? 3.5%
3  ????         3.0%          3.0       ???? 3.0%
4  ????         2.5%          2.5       ???? 2.5%
5  ????????          2.4%          2.4        ????????  2.4%

Мой код ниже:

bars = alt.Chart(percentages_df).mark_bar(color='orange').encode(
    alt.X('PERCENT:Q',axis=None),
    alt.Y('combined:N', sort='-x', title=None)
).configure_view(strokeOpacity=0).configure_axis(
    # remove axis line
    grid=False, domain=False,ticks=False
)

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

Но созданная мной диаграмма - это не то, что я ожидал.

Я хочу создать гистограмму Альтаира с двумя метками оси Y, например: введите описание изображения здесь

Должен ли я использовать слой для создания этой диаграммы? Если да, то как создать слои из двух меток оси Y? Если нет, что мне использовать для его создания? Спасибо!


person alisonggg    schedule 25.02.2021    source источник
comment
Вы имеете в виду, что хотите выровнять смайлики по левому краю, а числа справа в метках?   -  person Pranav Hosangadi    schedule 25.02.2021
comment
Да, но я не знаю, есть ли способ это сделать.   -  person alisonggg    schedule 25.02.2021


Ответы (2)


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

Я также изменил диаграмму, чтобы создать комбинированную метку с помощью преобразования:

import pandas as pd
import altair as alt

percentages_df = pd.DataFrame({
  'EMOJI': ['????', '????', '????', '????', '????', '????????'],
  'PERCENT': [23.1, 5.7, 3.5, 3.0, 2.5, 2.4]
})

alt.Chart(percentages_df).transform_calculate(
    combined = alt.datum.EMOJI + '    ' + alt.datum.PERCENT + '%'
).mark_bar(color='orange').encode(
    alt.X('PERCENT:Q',axis=None),
    alt.Y('combined:N', sort='-x', title=None,
          axis=alt.Axis(labelAlign='left', labelPadding=6))
).configure_view(strokeOpacity=0).configure_axis(
    # remove axis line
    grid=False, domain=False,ticks=False
)

диаграмма

Другой вариант - объединить две диаграммы, одна из которых не имеет x-кодировки:

import pandas as pd
import altair as alt

percentages_df = pd.DataFrame({
  'EMOJI': ['????', '????', '????', '????', '????', '????????'],
  'PERCENT': [23.1, 5.7, 3.5, 3.0, 2.5, 2.4]
})

chart = alt.Chart(percentages_df).mark_bar(color='orange').encode(
    alt.X('PERCENT:Q',axis=None),
    alt.Y('PERCENT:N', sort='-x', title=None)
)

left = alt.Chart(percentages_df).mark_text().encode(
    alt.Y('EMOJI:N', sort=alt.EncodingSortField('PERCENT', order="descending"), title=None)
)

alt.hconcat(
    left, right
).configure_view(strokeOpacity=0).configure_axis(
    # remove axis line
    grid=False, domain=False,ticks=False
)

диаграмма 2

person jakevdp    schedule 25.02.2021
comment
он показывает SyntaxError: недопустимый синтаксис для labelPadding = 6 [! [введите описание изображения здесь] [1]] [1] 0)) - person alisonggg; 25.02.2021
comment
Извините, вставка случайного изображения. Фиксированный! - person jakevdp; 25.02.2021

Вы также можете попробовать заполнить строку, которую вы используете для маркировки, пробелом через rjust. Чтобы это работало, вы должны использовать моноширинный шрифт, чтобы все символы были равны:

# With your df above
df['LABEL'] = df['EMOJI'] + df['PERCENT_TEXT'].str.rjust(8)

alt.Chart(df).mark_bar(color='orange').encode(
    alt.X('PERCENT:Q',axis=None),
    alt.Y('LABEL:N', sort='-x', title=None, axis=alt.Axis(labelFont='Droid Sans Mono'))
).configure_view(strokeOpacity=0).configure_axis(
    grid=False, domain=False,ticks=False
)

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

person joelostblom    schedule 25.02.2021