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

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

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

В этой статье рассказывается, как использовать Plotly для рисования диаграмм с областями, в основном на основе двух методов:

  • На основе реализации plotly_express
  • На основе реализации plotly.graph_objects

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

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

библиотека импорта

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go

Реализация на базе px

px.area creates a stacked area plot. Each filled area corresponds to one value of the column given by the line_group parameter.

px.area реализует диаграмму с областями с накоплением. Каждая заполняемая часть определяется заданным параметром line_group, в следующем случае используется встроенный набор данных gdp:

# 以GDP数据说明

gdp = px.data.gapminder()
gdp.head()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
fig = px.area(
    gdp,   # 待绘图数据
    x='year',  # 指定x\y轴和颜色,以及线性组别
    y='pop',
    color='continent',
    line_group="country"  # 关键参数
    )

fig.show()

Реализация на основе go

диаграмма базовой области

import plotly.graph_objects as go

fig = go.Figure()

# 7种填充方式:['none', 'tozeroy', 'tozerox', 'tonexty', 'tonextx','toself', 'tonext']

fig.add_trace(go.Scatter(
    x=[1, 2, 3, 4], 
    y=[13, 15, 21, 27], 
    fill='toself',
    name='toself'
    )) 

fig.add_trace(go.Scatter(
    x=[1, 2, 3, 4], 
    y=[13, 15, 21, 27], 
    fill='tonexty',
    name='tonexty'
    ))

fig.add_trace(go.Scatter(
    x=[1, 2, 3, 4], 
    y=[13, 15, 21, 27], 
    fill='tozerox',
    name='tozerox'  # 紧贴着Y轴填充
    ))

fig.add_trace(go.Scatter(
    x=[1, 2, 3, 4], 
    y=[13, 15, 21, 27], 
    fill='tozeroy',
    name='tozeroy'  # 紧贴着x轴填充
    ))

fig.show()

Графическое отображение различных методов наполнения:

краевая задача

Иногда нам нужно удалить отображение границы, используя параметр режима, метод использования;

  • Комбинации между линиями, маркерами и текстом
  • Используйте none, что означает, что граница не отображается.
# 如何取消边界线:加上参数mode='none'

import plotly.graph_objects as go

fig = go.Figure()

# 7种填充方式:['none', 'tozeroy', 'tozerox', 'tonexty', 'tonextx','toself', 'tonext']

fig.add_trace(go.Scatter(
    x=[1, 2, 3, 4], 
    y=[13, 15, 21, 27], 
    fill='tonext',
    mode='none',   # 参数:['lines', 'markers', 'text']的组合,或者none
    name='tonext'
    )) 

fig.show()

Диаграмма внутренней области заполнения

import plotly.graph_objects as go

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=[1, 2, 3, 4], 
    y=[3, 4, 8, 3],
    fill=None,
    mode='lines',
    line_color='red',  # trace0
))

fig.add_trace(go.Scatter(
    x=[1, 2, 3, 4],
    y=[1, 6, 2, 6],
    fill='tonexty', 
    mode='lines',  
    line_color='indigo'))  # trace1

fig.show()

Диаграмма с накоплением областей

Отображение данных путем стекирования данных

import plotly.graph_objects as go

x = ["小明","小红","小周","小孙"]

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=x,
    y=[100,120,110,108],  # 语文
    hoverinfo = 'x+y',  # 悬停显示的信息
    mode='lines',
    line=dict(width=0.5,color='rgb(121,90,200)'),
    stackgroup='one'   # 默认是堆叠分组统计
))

fig.add_trace(go.Scatter(
    x=x,
    y=[130,100,80,140],  # 数学
    hoverinfo = 'x+y',
    mode='lines',
    line=dict(width=0.5,color='rgb(121,231,219)'),
    stackgroup='one'   # 
))

fig.add_trace(go.Scatter(
    x=x,
    y=[98,120,149,91],  # 英语
    hoverinfo = 'x+y',
    mode='lines',
    line=dict(width=0.5,color='rgb(191,249,230)'),
    stackgroup='one'   
))

# fig.update_layout(yaxis_range=(0, 100))
fig.show()

Нормализованная диаграмма с накоплением областей

Указывает процент, занимаемый каждым графом

import plotly.graph_objects as go

x = ["小明","小红","小周","小孙"]

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=x,
    y=[30,20,40,30],  # 语文
    hoverinfo = 'x+y',
    mode='lines',
    line=dict(width=0.5,color='rgb(11,90,200)'),
    stackgroup='one',   
    groupnorm='percent'   # 重点参数:分组归一化,选择百分比
))

fig.add_trace(go.Scatter(
    x=x,
    y=[50,60,80,70],  # 数学
    hoverinfo = 'x+y',
    mode='lines',
    line=dict(width=0.5,color='rgb(121,231,219)'),
    stackgroup='one'   # 默认是堆叠分组统计
))

fig.add_trace(go.Scatter(
    x=x,
    y=[80,90,90,75],  # 英语
    hoverinfo = 'x+y',
    mode='lines',
    line=dict(width=0.5,color='rgb(191,249,230)'),
    stackgroup='one'   
))

fig.add_trace(go.Scatter(
    x=x,
    y=[100,100,100,200],  # 英语
    hoverinfo = 'x+y',
    mode='lines',
    line=dict(width=0.5,color='rgb(111,90,241)'),
    stackgroup='one'   
))

fig.update_layout(
    showlegend=True, # 是否显示图例,默认是显示的
#     xaxis_type='category',
    yaxis=dict(
    type='linear',
    range=[1, 100],  # y轴范围
    ticksuffix='%'))  # 标记后缀

fig.show()

выбрать информацию при наведении

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

  • Отображаются как отступы, так и точки данных
  • Показывать только при наведении на точки данных
import plotly.graph_objects as go

fig = go.Figure()
fig.add_trace(go.Scatter(
    x=[0,0.5,1,1.5,2],   # 绘图数据
    y=[0,1,2,1,0],
    fill='toself',   # 填充方式和颜色
    fillcolor='darkviolet',  
    hoveron = 'points+fills',   # 悬停位置:点和内部填充部分都悬停显示
    line_color='red',  # 线色
    text="Points + Fills",  # 文本显示
    hoverinfo = 'text+x+y'  # 指定悬停信息
))

fig.add_trace(go.Scatter(
    x=[3,3.5,4,4.5,5], 
    y=[0,1,2,1,0],
    fill='toself', 
    fillcolor = 'violet',
    hoveron='points',   #  只在点上悬停
    line_color='violet',
    text="Points only",    # 只显示点
    hoverinfo='text+x+y'
))

fig.update_layout(
    title = "hover on <i>points</i> or <i>fill</i>",  # 通过HTML标签语法的格式来生成标题
    xaxis_range = [0,5.2],  # 两个轴的数据范围
    yaxis_range = [0,3]
)

#fig.show()