Артефакт визуализации Plotly играет с ящичковыми диаграммами

искусственный интеллект визуализация данных
Артефакт визуализации Plotly играет с ящичковыми диаграммами

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Артефакт визуализации Plotly играет с ящичковыми диаграммами

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

Расширенное чтение

Статьи Plotly образуют последовательную серию. Первые восемь статей о визуализации Plotly:

коробочный сюжет

Что такое коробочный сюжет

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

В 1977 году известный американский математик Джон У. Тьюки впервые представил коробочную диаграмму в своей книге «Исследовательский анализ данных». Поклоняйтесь большому человеку!

Квартиль

Квартиль является наиболее важным понятием в ящичковых диаграммах.Следующее представляет соответствующие знания о квартиле.

Квартиль — это разновидность квантиля в статистике, то есть поставить все значенияот малого к большомуРазделите его на четыре равные части, и значение в трех точках деления будет квартилем.

  • Первый квартиль (Q1): также известный как нижний квартиль (Lower Quartile), равен 25-му процентилю всех значений в выборке, расположенных от меньшего к большему.
  • Второй квартиль (Q2): также известный как медиана (средний квартиль или медиана), равный 50-му процентилю всех значений в выборке, расположенных от меньшего к большему.
  • Третий квартиль (Q3): также известный как верхний квартиль (Upper Quartile), равен 75-му процентилю всех значений в выборке, расположенных от меньшего к большему.

Разница между Q3 и Q1 называетсяМежквартильный диапазон (IQR): IQR=Q3-Q1

Квартильный расчет

При расчете квартилей нам нужно сначала вычислить позиции квартилей, и вычисляются позиции 3-х квартилей:

# n表示样本个数
Q1的位置 = (n+1) / 4
Q2的位置 = (n+1) * 2 / 4
Q3的位置 = (n+1) * 3 / 4

Пример используется для объяснения расчета позиции.Есть 11 значений, расположенных в беспорядке следующим образом:

6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36

Сначала отсортируем значения от меньшего к большему:

6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49

Тогда позиции трех квартилей таковы:

# n=11表示样本个数
Q1的位置 = (11+1) / 4 = 3
Q2的位置 = (n+1) * 2 / 4 = 6
Q3的位置 = (n+1) * 3 / 4 = 9

Соответствующие 3 квартили: Q1=15, Q2=40, Q3=43, IQR=Q3-Q1=28.

Если вычисляемая позиция не является целым числом, то есть n+1 не является целым числом, кратным 4, то обычно берется средневзвешенное значение чисел по обе стороны от позиции (существуют и прямые средние значения), а более близкое позиция, тем выше вес.Как правило, веса:1 — десятичные знаки. Например, для следующего образца:

2,3,4,5

Тогда позиция вычисления Q1: (4+1)/4= 1,25, а ближе к 2, то Q1:

Q1=2 * (1 - 0.25) + 3 * 0.25 = 2.25   # 0.25是小数位 

Если взять среднее значение напрямую: Q1= (2+3) / 2 = 2,5

Сравнение 4 различных коробчатых диаграмм

Из сравнения 4-х разных диаграмм в Википедии:

Коробка сюжетная роль

  • Можно примерно увидеть, имеют ли данные симметрию
  • Отображает такую ​​информацию, как степень дисперсии распределения данных, особенно для сравнения нескольких выборок.
  • Отразить центральное расположение и распространение одной или нескольких групп непрерывных распределений количественных данных.
  • Проанализируйте различия на каждом уровне разных типов данных, а также выявите степень дисперсии, выбросов и различий в распределении между данными.

Самым большим преимуществом коробчатой ​​диаграммы является то, что на нее не влияют выбросы, она может точно и стабильно отображать дискретное распределение данных, а также способствует очистке данных.

набор данных

Ниже описывается рисование коробчатых диаграмм в различных сценариях спроса.Большая часть данных, используемых в этой статье, представляет собой набор данных советов по потреблению, который поставляется с plotly:

import pandas as pd
import numpy as np

import plotly_express as px
import plotly.graph_objects as go

# 消费数据集
tips = px.data.tips()
tips.head()

В этом чертеже также используются два метода:

import plotly_express as px  # 1、px实现
import plotly.graph_objects as go  # 2、go实现

Нарисуйте блочную диаграмму на основе пикселей

Точечная блочная диаграмма

Используйте точку каждого данных в качестве маркера, чтобы нарисовать ящичковую диаграмму, используя:px.strip()

# 使用的方法是:px.strip()

fig = px.strip(
    tips,
    x='day',  # 星期
    y='total_bill'  # 总账单
)

fig.show()

# 使用的方法是:px.strip()

fig = px.strip(
    tips,
    x='time',  # 中餐还是晚餐  
    y='tip'  # 小费
)

fig.show()

Базовая блочная диаграмма

fig = px.box(
  tips,  # 数据集
  y="total_bill"  # 针对哪个字段的数据做箱型图
)

fig.show()

Диаграмма сгруппированных блоков

Графики для групп с различными классификациями:

fig = px.box(
  tips,  # 数据集
  y="tip",  # 绘图字段
  color="time"  # 颜色字段
)

fig.show()

Вот еще один сгруппированный блок-график с немного большим количеством полей:

fig = px.box(
    tips,
    x="day",   # 分组的数据
    y="total_bill",  # 箱体图的数值
    color="day"  # 颜色分组
)

fig.show()

Блочная диаграмма с разбросом

Иногда, когда мы рисуем коробчатую диаграмму, нам нужно ввести точки разброса, а точки разброса представляют исходные данные. Возможны 4 варианта значения точки:

  • все: все
  • выбросы: выбросы
  • подозрения на выбросы: предполагаемые выбросы
  • Ложь: не отображать
fig = px.box(
    tips,
    x="day",
    y="total_bill",
    points="all"   # ['all', 'outliers', 'suspectedoutliers', False]
)

fig.show()

Коробчатая диаграмма с квартилями

Существует 3 способа расчета интерполяции рассеяния:

  • linear: Метод линейной разности, по умолчанию
  • исключительный: исключить статистику алгоритма. Если выборка нечетная, она не содержит медианы какой-либо половины, Q1 — медиана нижней половины, а Q3 — медиана верхней половины.
  • Включительно: содержит статистику алгоритма; если выборка нечетная, медиана включается в обе половины, Q1 — медиана нижней половины, а Q3 — медиана верхней половины.
fig = px.box(
    tips, 
    x="day",
    y="tip",
    color="smoker")

fig.update_traces(quartilemethod="exclusive") # exclusive inclusive linear (默认)

fig.show()

Сравнение 3 различных методов отображения квартилей

Смоделируйте набор данных:

data = [10,20,30,40,50,60,70,80,90]

pd.DataFrame(dict(
    linear=data,
    inclusive=data,
    exclusive=data
))

# 下面是数据的部分截图

Используйте метод плавления, чтобы объединить и преобразовать вышеуказанные данные, используя функцию плавления:

  • d_vars: имена столбцов, которые не нужно преобразовывать
  • value_vars: имя столбца, который необходимо преобразовать.Если все остальные столбцы должны быть преобразованы, нет необходимости писать
  • var_name и value_name — это имена столбцов, соответствующие пользовательским настройкам.
  • col_level: если столбец является MultiIndex, используется этот уровень
## 3种不同算法之间的比较结果

import plotly.express as px
import pandas as pd

data = [10,20,30,40,50,60,70,80,90]

df = pd.DataFrame(dict(
    linear=data,
    inclusive=data,
    exclusive=data
)).melt(var_name="quartilemethod")  # 宽表转成长表

df

Добавьте трассировки данных и джиттер интервала джиттера:

fig = px.box(
    df, 
    y="value", 
    facet_col="quartilemethod", 
    color="quartilemethod",
    boxmode="overlay", 
    points='all')

# jitter:数据抖动 =0表示没有抖动,点和点的距离是均衡的
fig.update_traces(quartilemethod="linear", jitter=0, col=1)
fig.update_traces(quartilemethod="inclusive", jitter=0, col=2)
fig.update_traces(quartilemethod="exclusive", jitter=0, col=3)

fig.show()

Диаграмма с выемкой

fig = px.box(
    tips,
    x="day",
    y="tip",
    color="smoker",
    notched=True,  # 显示缺口
    title="小费数据集箱体图",
    hover_data = ["day"]
)

fig.show()

Нарисуйте блок-график на основе go

Чертеж базовой схемы коробки

import plotly.graph_objects as go

fig = go.Figure(data=[go.Box(
    y=[0, 1, 1, 2, 4, 7, 9, 15, 21],
    boxpoints='all', # all、outliers 、suspectedoutliers、False
    jitter=0.3, # 数据点之间添加抖动
    pointpos=-1.5   # 点和箱体之间的距离,参数范围:[-2, 2]
      )])

fig.show()

Сгруппированный чертеж коробчатой ​​диаграммы

np.random.seed(1)  # 设置随机种子

y1 = np.random.randn(60) - 1   # 随机生成60个数据
y2 = np.random.randn(60) - 1

fig = go.Figure()

# 添加两个数据轨迹,形成图形
fig.add_trace(go.Box(y=y1)) 
fig.add_trace(go.Box(y=y2))

fig.show()

Мы также можем установить цвет графика:

fig = go.Figure()

# 添加两个数据轨迹,形成图形
fig.add_trace(go.Box(y=y1,  # 数值
                     name="图1",  # 轨迹名称
                     marker_color="red" # 颜色
                    )) 

fig.add_trace(go.Box(y=y2,
                     name="图2",
                     marker_color="lightseagreen"
                    ))

fig.show()

import plotly.graph_objects as go

x = ['day 1', 'day 1', 'day 1', 'day 1', 'day 1', 'day 1',
     'day 2', 'day 2', 'day 2', 'day 2', 'day 2', 'day 2']

fig = go.Figure()

fig.add_trace(go.Box(
    x=x,
    y=[0.2, 0.2, 0.6, 1.0, 0.5, 0.4, 0.2, 0.7, 0.9, 0.1, 0.5, 0.3],
    name='kale',
    marker_color='#3D0970'
))

fig.add_trace(go.Box(
    x=x,
    y=[0.6, 0.7, 0.3, 0.6, 0.0, 0.5, 0.7, 0.9, 0.5, 0.8, 0.7, 0.2],
    name='radishes',
    marker_color='#0F4136'
))

fig.add_trace(go.Box(
    x=x,
    y=[0.1, 0.3, 0.1, 0.9, 0.6, 0.6, 0.9, 1.0, 0.3, 0.6, 0.8, 0.5],
    name='carrots',
    marker_color='#FA851B'
))

fig.update_layout(
    yaxis_title='数值',
    boxmode='group' # 柱状图模式
)
fig.show()

Блок-схема полного стиля

import plotly.graph_objects as go

# x轴数据
x_data = ['小明', '小红','小周', '小孙','小张', '小苏']

N = 80

# 生成y轴数据:生成数据同时指定数据类型
y0 = (10 * np.random.randn(N) + 60).astype(np.int)
y1 = (13 * np.random.randn(N) + 78).astype(np.int)
y2 = (11 * np.random.randn(N) + 83).astype(np.int)
y3 = (9 * np.random.randn(N) + 76).astype(np.int)
y4 = (15 * np.random.randn(N) + 91).astype(np.int)
y5 = (12 * np.random.randn(N) + 80).astype(np.int)

y_data = [y0, y1, y2, y3, y4, y5]

# 颜色设置
colors = ['rgba(93, 164, 214, 0.5)', 
          'rgba(155, 144, 14, 0.5)', 
          'rgba(44, 160, 101, 0.5)',
          'rgba(155, 65, 54, 0.5)', 
          'rgba(27, 114, 255, 0.5)',
          'rgba(127, 96, 0, 0.5)']

fig = go.Figure()

# 通过zip函数生成6组不同的函数进行轨迹添加
# 生成不同的轨迹
for xd, yd, cls in zip(x_data, y_data, colors):
        fig.add_trace(go.Box(
            y=yd,  # y轴数据
            name=xd,  # 名称
            boxpoints='all',  # 箱体散点的显示
            jitter=0.5,  # 抖动距离
#             whiskerwidth=0.2,
            fillcolor=cls,  # 颜色
            marker_size=2,  # 标记大小
            line_width=1)  # 线宽
        )

# 布局设置
fig.update_layout(
    title='6名同学成绩比较',
    yaxis=dict(
        autorange=True,
        showgrid=True,  # 显示网格
        zeroline=True,  # 0基准线
        dtick=5,
        gridcolor='rgb(255, 255, 255)',  # 网格和基准线设置
        gridwidth=1,
        zerolinecolor='rgb(255, 255, 255)',
        zerolinewidth=2,
    ),
    margin=dict(
        l=40,
        r=30,
        b=80,
        t=100,
    ),
    paper_bgcolor='rgb(243, 243, 243)',  # 背景设置
    plot_bgcolor='rgb(243, 243, 243)',
    showlegend=True  # 显示图例
)

fig.show()

Отображение квартилей 3 различными способами

Отображение квартилей по 3 различным методам расчета:

import plotly.graph_objects as go

data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
fig = go.Figure()

fig.add_trace(go.Box(y=data, quartilemethod="linear", name="Linear Quartile"))
fig.add_trace(go.Box(y=data, quartilemethod="inclusive", name="Inclusive Quartile"))
fig.add_trace(go.Box(y=data, quartilemethod="exclusive", name="Exclusive Quartile"))

fig.update_traces(
    boxpoints='all',   # ['all', 'outliers', 'suspectedoutliers', False]
    jitter=0  # 没有抖动,点和点的距离是相同的
)

fig.show()

На приведенном выше рисунке хорошо видна разница между тремя различными методами определения различий.

Горизонтальная блочная диаграмма

x1 = np.random.randn(50)
x2 = np.random.randn(50) + 5

fig = go.Figure()
fig.add_trace(go.Box(x=x1))
fig.add_trace(go.Box(x=x2))

fig.show()

Сгруппированные горизонтальные диаграммы

import plotly.graph_objects as go

y = ['day 1', 'day 1', 'day 1', 'day 1', 'day 1', 'day 1',
     'day 2', 'day 2', 'day 2', 'day 2', 'day 2', 'day 2']

fig = go.Figure()

fig.add_trace(go.Box(
    y=y,
    x=[0.2, 0.2, 0.6, 1.0, 0.5, 0.4, 0.2, 0.7, 0.9, 0.1, 0.5, 0.3],
    name='kale',
    marker_color='#3D0970'
))

fig.add_trace(go.Box(
    y=y,
    x=[0.6, 0.7, 0.3, 0.6, 0.0, 0.5, 0.7, 0.9, 0.5, 0.8, 0.7, 0.2],
    name='radishes',
    marker_color='#0F4136'
))

fig.add_trace(go.Box(
    y=y,
    x=[0.1, 0.3, 0.1, 0.9, 0.6, 0.6, 0.9, 1.0, 0.3, 0.6, 0.8, 0.5],
    name='carrots',
    marker_color='#FA851B'
))

fig.update_layout(
#     xaxis_title='数值',
    xaxis=dict(
        title="数值",
        zeroline=False
    ),
    boxmode='group' # 柱状图模式
)

fig.update_traces(orientation='h')  # 水平柱状图
fig.show()

Блочная диаграмма со средним значением и дисперсией

import plotly.graph_objects as go

fig = go.Figure()
fig.add_trace(go.Box(
    y=np.random.randn(50),
    name='均值',
    marker_color='mediumblue',
    boxmean=True # 仅仅存在均值
))
fig.add_trace(go.Box(
    y=np.random.randn(50),
    name='均值和标准差',
    marker_color='red',
    boxmean='sd' # 表示同时存在均值和标准差
))

fig.show()

4 различных способа отображения точек данных

import plotly.graph_objects as go

y_data = [0.75, 5.25, 5.5, 6, 6.2, 6.6, 
       6.80, 7.0, 7.2, 7.5, 7.5, 7.75, 
       8.15,8.15, 8.65, 8.93, 9.2, 9.5, 
       10, 10.25, 11.5, 12, 16, 20.90, 
       22.3, 23.25]

fig = go.Figure()

fig.add_trace(go.Box(
    
    y=y_data,
    
    name="全部数据点",
    jitter=0.3,  # 抖动距离
    pointpos=-1.8,  # 散点和箱体图的距离
    boxpoints='all', #  all:显示全部数据点
    marker_color='rgb(7,40,89)',
    line_color='rgb(7,40,89)'
))

fig.add_trace(go.Box(
    y=y_data,
    name="晶须线",
    boxpoints=False, # 没有数据点,只有晶须线
    marker_color='rgb(109,56,125)',
    line_color='rgb(9,56,125)'
))

fig.add_trace(go.Box(
    y=y_data,
    name="可疑离群点",
    boxpoints='suspectedoutliers', # 可疑离群点
    marker=dict(
        color='rgb(8,81,156)',
        outliercolor='rgba(219, 64, 82, 0.6)',
        line=dict(
            outliercolor='rgba(219, 64, 82, 0.6)',
            outlierwidth=2)),
    line_color='rgb(8,81,156)'
))

fig.add_trace(go.Box(
    y=y_data,
    name="晶须+离群点",
    boxpoints='outliers', # 仅显示离群点
    marker_color='rgb(107,174,14)',
    line_color='rgb(107,174,214)'
))

fig.update_layout(title_text="基于个性化离群值的散点图")
fig.show()

Сюжет Радужной Коробки

import plotly.graph_objects as go
import numpy as np

N = 40     # 箱体图的个数
c = ['hsl('+str(h)+',50%'+',50%)' for h in np.linspace(0, 360, N)]

Конкретный код чертежа:

fig = go.Figure(data=[go.Box(
    # 使用三角函数来绘制图形
    y=3.5 * np.sin(np.pi * i/N) + i/N + (1.5 + 0.5 * np.cos(np.pi*i/N)) * np.random.rand(10),
    marker_color=c[i]
    ) for i in range(int(N))])

# 布局设置
fig.update_layout(
    # xy轴设置
    xaxis=dict(showgrid=True, 
               zeroline=False, 
               showticklabels=False),
    yaxis=dict(zeroline=False, 
               gridcolor='white'),
    # 背景颜色设置
    paper_bgcolor='rgb(233,233,233)',
    plot_bgcolor='rgb(233,233,233)',
)

fig.show()