Как сделать графики Altair отзывчивыми

Можно ли сделать так, чтобы графики Altair соответствовали размеру экрана, а не имели ширину и высоту, определяемые пикселями? Я читал кое-что о autosize"fit", но не знаю, где это указать.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
1 991
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это невозможно сделать. Размеры диаграмм Altair/Vega-Lite заранее определяются спецификацией диаграммы и данными, и их нельзя настроить в соответствии с размером окна браузера.

Хотя верно то, что вега-лайт определяет размер самой диаграммы, можно обращаться с диаграммой (отображенной как холст) как с изображением.

Я использовал пример из w3css, который применялся к моим диаграммам вега-лайт, соответственно масштабировал диаграммы. В основном он затем масштабируется пропорционально окружающему контейнеру.

Пример HTML, сгенерированный vega-light:

<div id = "visInteractiveYear" class = "vega-embed">
<canvas width = "1366" height = "960" class = "marks" style = "width: 976px; height: 686px;"></canvas>
</div>

Вот фрагмент CSS, который в основном перезаписывает ширину/высоту (стиль) холста:

canvas.marks {
    max-width: 100%!important;
    height: auto!important;
}

Вот тест без масштабирования и исходный размер:

Normal Chart (no scaling)

Здесь тест с масштабированием, чтобы соответствовать окружающему окну.

Chart scaled down via CSS

Если вы используете интерактивные диаграммы, масштабирование может быть проблемой. Я предполагаю, что позиции щелчка не переведены правильно (поскольку холст масштабируется, но логика веги об этом не знает), поэтому в результате происходит странное поведение. В моем случае выделение всегда имеет смещение относительно курсора мыши.

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

Возможно, лучшим вариантом будет переключиться на другую спецификацию vega-light, которая отображает диаграмму для определенного размера дисплея, или переключиться на другое представление (например, стандартный список), который затем можно будет легко прочитать на небольших дисплеях (адаптивное дизайн).

Для сложных диаграмм открытие диаграммы в другой вкладке браузера также может быть хорошим решением. Пользователь знает о новой вкладке, мобильный браузер должен отображать только одну диаграмму/изображение, так что не о чем беспокоиться. Таким образом, на новой вкладке легко перемещаться/прокручивать, поскольку она содержит только диаграмму и, возможно, кнопку возврата/закрытия вкладки.

Если вы используете Altair 4.0 или более позднюю версию, вы можете использовать properties() и container:

import altair as alt
from vega_datasets import data

source = data.cars()

plot = alt.Chart(source).mark_circle(size=60).encode(
    x='Horsepower',
    y='Miles_per_Gallon',
    color='Origin',
    tooltip=['Name', 'Origin', 'Horsepower', 'Miles_per_Gallon']
).properties(
    width='container',
    height='container'
)

Это сделает его отзывчивым, обратите внимание, что это размер каждого графика, если у вас есть несколько, он не работает, как вы ожидаете, но вместо этого каждый график будет иметь размер родительского контейнера.

Я хотел бы сделать это принятым ответом, но я не проверял его сам, чтобы быть уверенным.

herman 04.01.2020 21:40

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

bio 19.12.2020 09:43

К сожалению, это не работает в Jupyter Notebook с Altair 4.1.0. Как только я укажу width='container' и height='container', график сворачивается в невидимую точку.

Anton Golubev 19.01.2021 19:31

Мой @AntonGolubev делает то же самое. Вы нашли способ справиться с этим?

Ualas Rohrer 31.07.2021 00:17

@UalasRohrer, к сожалению, нет.

Anton Golubev 03.08.2021 10:46

Другие вопросы по теме