Как настроить масштаб мультиграфа (Альтаира) и добавить легенду?

#python #altair

Вопрос:

Мой код:

     size = alt.datum.confirmed > 0

    testplot1 = alt.Chart(df_ww_ru).transform_filter(
        size
    ).mark_line(color='red').encode(
        x=alt.X('date:T', type='temporal', title='Дата'),
        y=alt.Y('sum(confirmed):Q',  title='aboba'),
        tooltip='sum(confirmed)'
    )

    testplot2 = alt.Chart(df_ru_ru).transform_filter(
        size
    ).mark_line(color='blue').encode(
        x=alt.X('date:T', type='temporal', title='Дата'),
        y=alt.Y('sum(confirmed):Q', title='aboba'),
        tooltip='sum(confirmed)'
    )

    testplot_rez = alt.layer(testplot1, testplot2).configure_view(
    ).properties(
        width=820,
        height=500
    ).configure_axis(
        labelFontSize=17,
        titleFontSize=20
    )
 

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

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

Как это можно исправить? Мне также нужно добавить легенду, где нужно будет подписать эти две строки, как это сделать? Можно ли это сделать так же, как в matplotlib? То есть назовите все вручную.

Ответ №1:

Что касается добавления легенды, то, вероятно, проще всего было бы объединить два кадра данных так, чтобы получился один кадр данных со столбцами date , confirmed , и category . Значения category будут либо wu_ru или ru_ru . Таким образом, вы можете задать кодировку color='category' при создании графика altair и создать легенду автоматически, как в этом примере. Вероятно, вы можете использовать pandas merge или concat для объединения dfs, а затем pandas расплавить, чтобы получить его в правильном формате. Более подробную информацию о форматах данных в Altair можно найти в документах.

Что касается экстента по оси y, он автоматически настраивается в соответствии с данными, поэтому я хотел бы взглянуть на значения, которые у вас есть, и убедиться, что нет действительно больших значений, которые отклоняются от оси. Если вы хотите изменить масштаб оси вручную, вы можете использовать что-то вроде alt.Y('sum(confirmed):Q', scale=alt.Scale(domain=0, 1000))