2025, Nov 21 03:02
Как корректно вывести проценты в диаграмме PowerPoint из Python
Почему PowerPoint показывает 2493% вместо 24.93 и как это исправить в Python: нормализуйте данные до 0–1 и используйте number_format '0%'. Готовый код и советы.
Как вывести проценты на диаграмме PowerPoint из Python так, чтобы числа не раздувались, — удивительно частая загвоздка. Значения вроде бы показываются со знаком процента, но диаграмма выводит 2493% вместо задуманного 24.93%. Корень проблемы не в самой диаграмме, а в том, как процентные форматы интерпретируют исходные числа.
Сценарий, который приводит к проблеме
Ниже код создает диаграмму на слайде PowerPoint и применяет к значениям рядов процентный формат. Логика проста: пройтись по фигурам, найти диаграмму, заполнить категории и ряды и передать данные диаграмме. Однако при таком подходе числа вроде 24.93 отображаются как 2493%.
if current_slide:
for shp in current_slide.shapes:
if shp.shape_type == MSO_SHAPE_TYPE.CHART:
plot = shp.chart
if data_map and month_keys and category_names:
chart_data = CategoryChartData()
chart_data.categories = category_names
for month_key in month_keys:
chart_data.add_series(str(month_key), values=data_map[month_key], number_format='0%')
plot.replace_data(chart_data)
print(data_map)
Почему диаграмма показывает 2493% вместо 24.93%
Процентное форматирование ожидает десятичные значения, нормализованные к диапазону 0.0–1.0, и уже их показывает как 0–100%. Иными словами, при number_format, равном 0%, значение 0.2493 отображается как 24.93%. Если же передать 24.93 напрямую, диаграмма при выводе умножит его еще раз, и получится 2493%.
Решение: нормализуйте значения перед добавлением в диаграмму
Чтобы проценты корректно отображались и на точках данных, и на осях, делите значения на 100 перед добавлением рядов, оставляя number_format равным 0%.
if current_slide:
for shp in current_slide.shapes:
if shp.shape_type == MSO_SHAPE_TYPE.CHART:
plot = shp.chart
if data_map and month_keys and category_names:
chart_data = CategoryChartData()
chart_data.categories = category_names
for month_key in month_keys:
pct_values = [val / 100 for val in data_map[month_key]]
chart_data.add_series(str(month_key), values=pct_values, number_format='0%')
plot.replace_data(chart_data)
Почему это важно
Диаграммы применяют правила форматирования к исходным данным, а не к видимому тексту. Если привести числа к ожидаемому масштабу, вы избегаете вводящих в заблуждение подписей, неверных осей и неоднозначной визуализации. Когда значения рядов — нормализованные десятичные дроби, 0.2493 под форматом 0% превращается в 24.93% — именно то, что нужно для аккуратной и точной отчетности.
Ключевые выводы
Передавайте в диаграмму десятичные дроби и предоставьте number_format управление отображением. Не вставляйте знак процента в данные и не передавайте уже умноженные значения. Нормализуйте в диапазон 0.0–1.0, держите number_format равным 0% и проверьте, что число вроде 0.2493 отображается как 24.93% и в подписях данных, и на осях.