Я пытался написать таблицу, в которой некоторые записи были многострочными, с помощью Altair, но, похоже, у меня возникли проблемы с исправлением межстрочного интервала. Например:
text_df = pd.DataFrame({"a":["very very very very long thing", "very very very very very long thing"]})
text_chart_base = alt.Chart(text_df).transform_window(row_number = "row_number()").transform_calculate(
y=f"split(datum.a, ' ')"
).mark_text(align = "left", baseline = "top"
).encode(y=alt.Y("row_number:N", axis=None, scale=alt.Scale(reverse=True)))
col1 = text_chart_base.encode(text=f"y:N")
col2= text_chart_base.encode(text=f"row_number:N")
col1 | col2
дает мне перекрывающиеся многострочные строки
Вместо этого, когда я делаю количественный row_number с помощью encode(y=alt.Y("row_number:Q", axis=None, scale=alt.Scale(reverse=True))), между строками получается слишком много места.
Есть ли способ заставить mark_text задать правильное расстояние между строками? (То есть вывод примерно такой)
@Psidom - я искал две строки, используя переменное количество строк без большого интервала между ними (добавил пример желаемого результата к вопросу)





Вы можете установить общую высоту графика или высоту на тик/шаг, например:
import altair as alt
import pandas as pd
text_df = pd.DataFrame({"a":["one two three four", "A B", "1 2"]})
text_chart_base = alt.Chart(text_df, height=alt.Step(60)).transform_window(
row_number = "row_number()"
).transform_calculate(
y = "split(datum.a, ' ')",
).mark_text(
align = "left",
baseline = "bottom"
).encode(
y=alt.Y("row_number:O")
)
col1 = text_chart_base.encode(text = "y:N")
col2 = text_chart_base.encode(text = "row_number:N")
col1 | col2
Как вы можете видеть, интервал не адаптируется к содержимому, а является статическим для каждой позиции, поэтому между второй и третьей строками будет пробел. Я думаю, что это можно исправить, установив высоту шага, которая будет применяться к смещению, а не к позиции тика, но я не смог заставить что-то подобное работать:
text_df = pd.DataFrame({"a":["one two three four", "A B", "1 2"]})
text_chart_base = alt.Chart(text_df, height=alt.Step(70, **{'for': 'offset'})).transform_window(
row_number = "row_number()"
).transform_calculate(
y = "split(datum.a, ' ')",
offset = "length(datum.y)"
).mark_text(
align = "left",
baseline = "bottom"
).encode(
y=alt.Y("row_number:O"),
yOffset=alt.Y("offset:Q")
)
col1 = text_chart_base.encode(text = "y:N")
col2 = text_chart_base.encode(text = "offset:N")
col1 | col2
Каков ваш ожидаемый результат?