Plotly: как обрабатывать разный размер текста на графике воронки с накоплением?

Я пытаюсь создать сложенный воронкообразный график действий. Метки не отображаются на графике должным образом.

Сначала мой код:

import pandas as pd
import plotly.express as px

stages = ["Initial Landing", "Step 2", "Step 3", "Added to cart", "Purchased"]
regiona_plotly = pd.DataFrame(dict(number=[10866,10543,1067,1032,108], stage=stages))
regionb_plotly = pd.DataFrame(dict(number=[10650,10432,1076,1036,1012], stage=stages))
regiona_plotly['region'] = "Region A"
regionb_plotly['region'] = "Region B"
df = pd.concat([regiona_plotly, regionb_plotly], axis=0)
fig = px.funnel(df, x='number', y='stage', color='region')
fig.update_traces(textposition='auto')
fig.update_layout(autosize=True)
fig.write_image("region_funnel.png")

(Почти полностью взято из сюжетных документов)

Этот код создает такое изображение:

Обратите внимание, что на «Шаг 3», «Добавлено в корзину» и «Куплено» текст региона А масштабируется очень мелко и находится внутри полосы, а регион Б — снаружи.

Я попытался обновить эту строку:

fig.update_traces(textposition='outside')

Но при этом я получаю, что оба значения перекрываются на стороне региона B воронки. Также текст выходит за пределы сюжета по верхним полосам.

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

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 047
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Короткий ответ:

Кажется, это ошибка. Если вам нужно .png изображение вашей фигуры, запустите:

import plotly
plotly.offline.plot(fig, filename='funnel.html')

А затем создайте версию .png, используя значок камеры в пользовательском интерфейсе:

Результат:


Детали:

Это странно. И, вполне возможно, ошибка, которая будет интересна форуму сюжетного сообщества. Хотя у меня есть обходной путь. Предполагая, что на самом деле вы хотели бы получить здесь .png файл изображения вашего сюжета.

Если вы запустите свой точный код в JupyterLab, но замените строку fig.write_image("region_funnel.png") только на fig.show(), вы получите следующее:

Там нет мелкого текста! И если я правильно понимаю, рисунок без изменения размера текста был бы удовлетворительным решением? Но fig.show() создает html-объект, а не .png изображение. Поэтому я протестировал доступные параметры вывода для fig.write_image(), а именно:

  • 'пнг'
  • 'jpg' или 'jpeg'
  • 'веб-сайт'
  • 'svg'
  • 'pdf'
  • 'eps' (требуется установка библиотеки poppler)

Я исключил webp и eps как жизнеспособные решения и протестировал остальные. И каждый из них производил один и тот же незавершенный текст разного размера. Даже создание рисунка с помощью fig.show() в JupyterLab, а затем ручная загрузка файла с помощью значка камеры в пользовательском интерфейсе дали те же результаты, хотя html-версия выглядела нормально.

Но если вы запустите:

import plotly
plotly.offline.plot(fig, filename='funnel.html')

А затем загрузите версию .png, вы получите это:

Что должно быть жизнеспособным вариантом для вас, если я правильно понимаю. По общему признанию, это далеко не идеальный ответ, но я надеюсь, что вы все равно найдете его полезным.

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