Округление чисел в квартильных цифрах сюжетной коробки

Я копался, пытаясь понять, как округлить числа, отображаемые в квартильных цифрах, отображаемых в функции наведения. Должен быть простой способ сделать это, как с координатами x и y. В этом случае будет достаточно округления до двух знаков после запятой.

df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/tips.csv")

fig = go.Figure(data=go.Box(y=df['total_bill'],
                            name='total_bill',
                            boxmean=True,
                           )
               )

fig.update_layout(width=800, height=800,
                  hoverlabel=dict(bgcolor = "white",
                                  font_size=16,
                                  font_family = "Arial",
                                 )
                 )
fig.show()

Округление чисел в квартильных цифрах сюжетной коробки

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

Ответы 1

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

К сожалению, это похоже на то, что Plotly не может легко сделать. Если вы измените hovertemplate, он будет применяться только к маркерам, на которые вы наводите курсор (выбросы), а десятичные знаки после каждого из статистических данных на ящичной диаграмме останутся неизменными при наведении курсора. Другая проблема с plotly-python заключается в том, что вы не можете извлечь статистику boxplot, потому что это потребует от вас взаимодействия с javascript под капотом.

Тем не менее, вы можете рассчитать статистику коробчатой ​​диаграммы самостоятельно, используя тот же метод, что и график, и округлить всю статистику до двух знаков после запятой. Затем вы можете передать статистику блочной диаграммы: lowerfence, q1, median, mean, q3, upperfence заставить график построить блочную диаграмму вручную и отобразить все выбросы как еще одну трассировку рассеяния.

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

from math import floor, ceil
from numpy import mean
import pandas as pd
import plotly.graph_objects as go

df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/tips.csv")

## calculate quartiles as outlined in the plotly documentation 
def get_percentile(data, p):
    data.sort()
    n = len(data)
    x = n*p + 0.5
    x1, x2 = floor(x), ceil(x)
    y1, y2 = data[x1-1], data[x2-1] # account for zero-indexing
    return round(y1 + ((x - x1) / (x2 - x1))*(y2 - y1), 2)

## calculate all boxplot statistics
y = df['total_bill'].values
lowerfence = min(y)
q1, median, q3 = get_percentile(y, 0.25), get_percentile(y, 0.50), get_percentile(y, 0.75)
upperfence = max([y0 for y0 in y if y0 < (q3 + 1.5*(q3-q1))])

## construct the boxplot
fig = go.Figure(data=go.Box(
    x=["total_bill"]*len(y),
    q1=[q1], median=[median], mean=[round(mean(y),2)],
    q3=[q3], lowerfence=[lowerfence],
    upperfence=[upperfence], orientation='v', showlegend=False,
    )
)

outliers = y[y>upperfence]
fig.add_trace(go.Scatter(x=["total_bill"]*len(outliers), y=outliers, showlegend=False, mode='markers', marker = {'color':'#1f77b4'}))
               

fig.update_layout(width=800, height=800,
                  hoverlabel=dict(bgcolor = "white",
                                  font_size=16,
                                  font_family = "Arial",
                                 )
                 )

fig.show()

Спасибо за это. Я боялся, что иду по этому пути, но, учитывая, что все это можно обернуть в вызов функции, это будет весьма полезно. Я заметил, что добавление boxmean='sd' также красиво округляется при наведении курсора. Сначала я не получил x=["total_bill"]*len(y), но потом понял, что строка может быть любой, что также может быть полезно в некоторых отношениях (например, изменить ее на «общий счет» без подчеркивания).

Alex G 19.03.2022 17:32

Я рад слышать, что мой ответ был полезен! обертывание этого в функцию звучит как хороший способ для вашего предполагаемого варианта использования

Derek O 20.03.2022 07:52

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