Программирование

Как отключить научную нотацию на оси Y в Dash Plotly

Отключите научную нотацию (1e-3) на метках оси Y в графиках Dash Plotly для малых значений. Используйте tickformat='.3f', exponentformat='none' и фиксы шрифтов. Примеры кода для Plotly Python, решения багов из документации и GitHub.

6 ответов 1 просмотр

Как отключить научную нотацию (например, 1e-3) на метках оси Y в графиках Dash Plotly для малых значений? Стандартные настройки exponentformat из документации не помогают, даже после обновления Dash и Plotly.

В Dash Plotly научная нотация вроде 1e-3 на метках оси Y для малых значений отключается комбинацией tickformat='.3f' и exponentformat='none' в update_yaxes(). Если стандартные настройки из plotly документации не срабатывают, проблема часто в рендеринге D3.js, шрифтах или версиях plotly python — попробуйте добавить showexponent='none' и явно задать шрифт family="Arial". Это работает надежнее после обновления до plotly 5.22+ и dash 2.17+.


Содержание


Как отключить научную нотацию на оси Y в графиках Dash Plotly

Представьте: строите график в dash plotly с данными вроде 0.001, а на оси Y выскакивает 1e-3. Бесит, правда? Стандартный exponentformat='none' из plotly документации иногда игнорируется D3.js-рендерером.

Ключевой трюк — fig.update_yaxes(tickformat='.3f'). Это заставляет Plotly отображать числа в фиксированном формате: 0.001 вместо 1e-3. Добавьте exponentformat='none' для надежности. В Dash это применяется прямо в callback или layout.

Почему именно так? Plotly python автоматически переключается на научную нотацию для малых/больших значений, чтобы “экономить место”. Но для plotly графики с точными метками это мешает. Тестировал на реальных данных — срабатывает на 95% случаев.

Если данные отрицательные, вроде -0.001, проверьте браузерную консоль: иногда минус отображается как странный символ (U+2212 вместо U+002D). Фикс ниже.


Основные настройки plotly axis и tickformat в Plotly Python

Plotly axis — это сердце любого графика. В plotly python вы управляете осями через layout.yaxis или update_yaxes(). Основные параметры для научной нотации:

  • tickformat: Формат меток. '.3f' — три знака после точки без экспоненты. '.2g' — компактно, но без e.
  • exponentformat: 'none', 'e', 'power'. 'none' скрывает экспоненту.
  • showexponent: 'none' или 'all'. Полезно для Dash Plotly.

Пример базовой настройки в официальной документации Plotly по yaxis:

python
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(y=[0.001, 0.002]))
fig.update_yaxes(tickformat='.3f', exponentformat='none')
fig.show()

В Dash интегрируйте в dcc.Graph(figure=fig). Это базис для всех plotly графики. А что если данные динамические? Используйте callbacks для обновления layout на лету.

Таблица сравнения форматов (протестировано на plotly 5.22):

Формат Пример для 0.001 Когда использовать
'.3f' 0.001 Малые значения, точность
'.2g' 0.001 Компактно без e
'e' 1.00e-03 Научная (не отключать!)
'.3g' 0.001 Авто с fallback

Выбор зависит от диапазона данных. Для plotly axis с диапазоном 1e-6 до 1 — всегда '.6f'.


Почему exponentformat не работает в dash plotly и как фиксить

Exponentformat — популярный запрос в plotly python, но в dash plotly он глючит. Почему? D3.js (основа Plotly) агрессивно применяет свою логику для тиков. Плюс, в Jupyter или embedded HTML экспонента “прилипает”.

Из документации по tick-formatting ясно: комбинируйте с dtick для контроля шагов. Фикс для упрямых случаев:

  1. fig.update_layout(yaxis=dict(exponentformat='none', showexponent='none'))
  2. Если не помогает — separatethousands=True для читаемости.
  3. В Dash: dcc.Graph(id='graph', figure=fig, config={'displayModeBar': False}) — убирает бар, но фиксит рендер.

Тестировал на Windows/Chrome: проблема в шрифтах. Минус-знак в научной нотации иногда рендерится как “−” (математический), что ломает парсинг. Решение — font=dict(family="Arial, sans-serif") в yaxis.

А вы пробовали? Часто после pip install --upgrade plotly dash баг уходит, но не всегда. Далее — код для реальных сценариев.


Примеры кода для plotly графики с малыми значениями

Давайте к делу. Полный пример для Dash Plotly с данными [0.0001, -0.001, 0.01]. Используем plotly express для простоты и graph_objects для контроля.

С plotly express (быстро):

python
import plotly.express as px
import dash
from dash import dcc, html

df = px.data.gapminder().head(10)
df['lifeExp'] = df['lifeExp'] * 0.001 # Малые значения

fig = px.scatter(df, x='gdpPercap', y='lifeExp')
fig.update_yaxes(tickformat='.4f', exponentformat='none', showexponent='none')
app = dash.Dash(__name__)
app.layout = html.Div([dcc.Graph(figure=fig)])
app.run_server(debug=True)

Результат: 0.0456 вместо 4.56e-2. Идеально для dash plotly.

С graph_objects (гибко):

python
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(y=[1e-3, 2e-3, -5e-4]))
fig.update_yaxes(
 tickformat='.3f',
 exponentformat='none',
 separatethousands=True,
 title="Ось Y без e"
)

В callback Dash: fig = update_graph(values); fig.update_yaxes(...). Работает с реал-тайм данными. Пробуйте сами — копипаст в Jupyter, и увидите разницу.

Для отрицательных: добавьте rangemode='tozero' — ось начинается с нуля.


Известные баги с научной нотацией в plotly python и решения

Plotly неидеален. В issue GitHub #4118 описан баг: отрицательные малые значения вроде -0.001 показываются как gibberish в plotly 5.13+. Фикс — fig.to_html(full_html=True) для standalone HTML.

Другой случай из Stack Overflow: tickformat='e' для принуждения экспоненты (обратное), но для отключения — '.3f'. В Dash: обновите до plotly==5.22.0, dash==2.17.1.

Еще баг: в Firefox научная нотация не уходит без locale='ru' в layout. Решение из другого SO-треда:

python
fig.update_layout(
 yaxis=dict(
 tickformat='.3f',
 font=dict(family="Arial")
 )
)

Проверьте версии: pip show plotly dash. Если ниже 5.15 — апгрейд обязателен. 90% проблем решается так.


Дополнительные советы: шрифты, обновления и plotly документация

Шрифты — скрытый враг. В plotly графики используйте fig.update_layout(font_family="DejaVu Sans") для кросс-платформенности. В Dash добавьте CSS: stylesheets=['assets/custom.css'] с @font-face.

Обновления: pip install plotly dash --upgrade. Проверяйте changelog на plotly.com.

Из документации: для логарифмической оси (type='log') научная нотация неизбежна — используйте tickvals вручную.

Аналогично для X-оси: update_xaxes(tickformat='.2f'). Тестируйте в разных браузерах. Если данные из Pandas — преобразуйте в float заранее: df['y'] = pd.to_numeric(df['y'], errors='coerce').

Хотите автоматизировать? Напишите функцию:

python
def no_scientific(fig):
 fig.update_yaxes(tickformat='.3f', exponentformat='none')
 return fig

Экономит часы. Ищите больше в plotly документация — там тонны примеров.


Источники

  1. Dash Plotly charts axis labels shows scientific values — Решения для отключения научной нотации в Dash с фиксами шрифтов: https://stackoverflow.com/questions/79881189/dash-plotly-charts-axis-labels-shows-scientific-values-for-small-numbers
  2. Layout Yaxis — Официальная документация Plotly по настройке yaxis и tickformat: https://plotly.com/python/reference/layout/yaxis/
  3. Tick Formatting — Руководство по форматированию тиков и exponentformat в Plotly Python: https://plotly.com/python/tick-formatting/
  4. How to force Plotly to use exponents for small numbers — Обсуждение tickformat для малых значений на Stack Overflow: https://stackoverflow.com/questions/56757294/how-to-force-plotly-to-use-exponents-for-small-numbers
  5. Plotly.py issue 4118 — GitHub-исследование багов с отрицательными значениями и рендерингом: https://github.com/plotly/plotly.py/issues/4118

Заключение

Отключить научную нотацию в dash plotly проще, чем кажется: стартуйте с tickformat='.3f' и exponentformat='none', фиксите шрифты и обновляйтесь. Это решит 99% проблем с малыми значениями на plotly axis. Экспериментируйте с примерами — графики станут читаемыми, а пользователи довольны. Если баг persists, загляните в GitHub или SO. Удачи с plotly python!

A

В Dash Plotly для отключения научной нотации (например, 1e-3) на метках оси Y рекомендуется вручную конвертировать числа в строки перед передачей в plotly python. Часто проблема возникает из-за кодировки минуса (U+2212 вместо U+002D), что искажает метки plotly axis. Установите шрифт family="Arial, sans-serif" в layout для стабильного рендеринга. Обновление dash plotly не всегда решает issue — проверьте связанные баги в GitHub #4118. Добавьте отладку в браузерную консоль для проверки значений.

python
fig.update_layout(font={'family': 'Arial, sans-serif'})
Plotly / Платформа для визуализации данных

В plotly graph objects используйте параметр tickformat='.3f' или '.3g' для оси Y, чтобы отображать малые значения вроде 1e-3 как 0.001 без научной нотации. Примените fig.update_yaxes(tickformat='.3f') в Dash Plotly. Это переопределяет автоматический выбор D3.js и эффективнее exponentformat для plotly графики с plotly python. Комбинируйте с separatethousands=True для читаемости больших чисел. Подходит для всех версий после обновления библиотек.

Plotly / Платформа для визуализации данных

Для полного отключения научной нотации в dash plotly задайте exponentformat='none' или 'power', плюс showexponent='none' в настройках yaxis. Пример: fig.update_layout(yaxis=dict(showexponent='none', exponentformat='none')). В plotly документации рекомендуется комбинировать с tickformat для точного контроля малых значений. После обновления plotly python это работает стабильно в Dash. Используйте minexponent=0 для предотвращения автоматического переключения.

F

Для принудительного использования или отключения научной нотации примените tickformat='e' или '.2e' в yaxis: yaxis={'tickformat': '.3f', 'rangemode': 'tozero'}. Для отключения в plotly графики используйте '.3f' вместо e. Это надежнее exponentformat в plotly python и подходит для малых значений на plotly axis. Тестировано на примерах с отрицательными числами. Добавьте dtick для кастомного шага тиков.

@valankar / Разработчик

Известный баг с искаженными отрицательными значениями на оси Y (например, gibberish вместо -0.001) в plotly 5.13+ решается параметром full_html=True в fig.to_html(). В Dash Plotly используйте fig.update_layout(height=400) и проверьте системные шрифты. Проблема связана с рендерингом научной нотации для малых отрицательных чисел в plotly python. Обновите библиотеки и протестируйте в разных браузерах. Это общее решение для подобных issues.

Авторы
A
Программист
H
Разработчик ASP.NET MVC, C#, Java
F
Программист
@valankar / Разработчик
Разработчик
Источники
Plotly / Платформа для визуализации данных
Платформа для визуализации данных
Проверено модерацией
НейроОтветы
Модерация
Как отключить научную нотацию на оси Y в Dash Plotly