5种可视化有助于改善数据故事

本文是在Python开发人员课程之前翻译的




讲故事是数据分析专业人员最重要的技能之一。要交流思想并令人信服地进行交流,您需要建立有效的交流。在本文中,我们将介绍5种可视化方法,这些方法超出了传统的理解范围,可以使您的数据故事更加美观和美观。我们将使用Python中Plotly图形库(R中也提供该),使您可以轻松创建动画图和交互式图。

擅长Plotly


绘图图可以轻松地集成到各种环境中:它们在jupyter笔记本中运行良好,可以嵌入网站中,并且还与Dash(用于创建仪表板和分析应用程序的出色工具)完全集成

开始吧


如果尚未安装plot,则可以使用以下命令执行此操作:

pip install plotly

太好了,现在您可以继续!

1.动画


例如,当我们考虑特定指标的演变时,我们的工作通常与时间数据相关。使用plotly中的动画是一个很酷的工具,它仅需一行代码即可帮助反映数据随时间的变化。



import plotly.express as px
from vega_datasets import data
df = data.disasters()
df = df[df.Year > 1990]
fig = px.bar(df,
             y="Entity",
             x="Deaths",
             animation_frame="Year",
             orientation='h',
             range_x=[0, df.Deaths.max()],
             color="Entity")
# improve aesthetics (size, grids etc.)
fig.update_layout(width=1000,
                  height=800,
                  xaxis_showgrid=False,
                  yaxis_showgrid=False,
                  paper_bgcolor='rgba(0,0,0,0)',
                  plot_bgcolor='rgba(0,0,0,0)',
                  title_text='Evolution of Natural Disasters',
                  showlegend=False)
fig.update_xaxes(title_text='Number of Deaths')
fig.update_yaxes(title_text='')
fig.show()

如果您有一个变量可以帮助您按时间过滤,则几乎所有图表都可以设置动画。散点图动画示例:

import plotly.express as px
df = px.data.gapminder()
fig = px.scatter(
    df,
    x="gdpPercap",
    y="lifeExp",
    animation_frame="year",
    size="pop",
    color="continent",
    hover_name="country",
    log_x=True,
    size_max=55,
    range_x=[100, 100000],
    range_y=[25, 90],

    #   color_continuous_scale=px.colors.sequential.Emrld
)
fig.update_layout(width=1000,
                  height=800,
                  xaxis_showgrid=False,
                  yaxis_showgrid=False,
                  paper_bgcolor='rgba(0,0,0,0)',
                  plot_bgcolor='rgba(0,0,0,0)')

2.朝阳图


朝阳图是一种通过操作可视化分组的好方法。如果要将可用数据量分解为一个或多个类别变量,请使用森伯斯特图。

假设我们需要按性别和一天中的时间获取小费分布。因此,我们可以两次使用分组操作符,并轻松地可视化接收到的数据,以免看到通常的表输出。



该图是交互式的,您可以单击类别并单独查看每个类别。您要做的就是决定这些类别,仔细考虑它们之间的层次结构(参数parents在代码中),并分配适当的值,在我们的情况下,该值将是操作员对该的输出

import plotly.graph_objects as go
import plotly.express as px
import numpy as np
import pandas as pd
df = px.data.tips()
fig = go.Figure(go.Sunburst(
    labels=["Female", "Male", "Dinner", "Lunch", 'Dinner ', 'Lunch '],
    parents=["", "", "Female", "Female", 'Male', 'Male'],
    values=np.append(
        df.groupby('sex').tip.mean().values,
        df.groupby(['sex', 'time']).tip.mean().values),
    marker=dict(colors=px.colors.sequential.Emrld)),
                layout=go.Layout(paper_bgcolor='rgba(0,0,0,0)',
                                 plot_bgcolor='rgba(0,0,0,0)'))

fig.update_layout(margin=dict(t=0, l=0, r=0, b=0),
                  title_text='Tipping Habbits Per Gender, Time and Day')
fig.show()

现在让我们添加另一个层次结构级别:



为此,我们将添加另一个group by的结果,从中我们将获得另外三个类别。

import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
import numpy as np
df = px.data.tips()
fig = go.Figure(go.Sunburst(labels=[
    "Female", "Male", "Dinner", "Lunch", 'Dinner ', 'Lunch ', 'Fri', 'Sat',
    'Sun', 'Thu', 'Fri ', 'Thu ', 'Fri  ', 'Sat  ', 'Sun  ', 'Fri   ', 'Thu   '
],
                            parents=[
                                "", "", "Female", "Female", 'Male', 'Male',
                                'Dinner', 'Dinner', 'Dinner', 'Dinner',
                                'Lunch', 'Lunch', 'Dinner ', 'Dinner ',
                                'Dinner ', 'Lunch ', 'Lunch '
                            ],
                            values=np.append(
                                np.append(
                                    df.groupby('sex').tip.mean().values,
                                    df.groupby(['sex',
                                                'time']).tip.mean().values,
                                ),
                                df.groupby(['sex', 'time',
                                            'day']).tip.mean().values),
                            marker=dict(colors=px.colors.sequential.Emrld)),
                layout=go.Layout(paper_bgcolor='rgba(0,0,0,0)',
                                 plot_bgcolor='rgba(0,0,0,0)'))
fig.update_layout(margin=dict(t=0, l=0, r=0, b=0),
                  title_text='Tipping Habbits Per Gender, Time and Day')

fig.show()

3.平行类别


可视化类别之间关系的另一种好方法是使用此并行类别图表。您可以随时随地拖动,选择和获取值,这对于演示非常有用。



import plotly.express as px
from vega_datasets import data
import pandas as pd
df = data.movies()
df = df.dropna()
df['Genre_id'] = df.Major_Genre.factorize()[0]
fig = px.parallel_categories(
    df,
    dimensions=['MPAA_Rating', 'Creative_Type', 'Major_Genre'],
    color="Genre_id",
    color_continuous_scale=px.colors.sequential.Emrld,
)
fig.show()

4.平行坐标


平行坐标图是上述图形的扩展版本。在此,图表的每个部分反映了一个观察结果。这是检测异常值(与其余数据隔离的单个流),聚类,趋势和冗余数据的好工具(例如,如果两个变量对于所有观察值都具有相同的值,它们将位于一条水平线上,这表明存在冗余)。



import plotly.express as px
from vega_datasets import data
import pandas as pd
df = data.movies()
df = df.dropna()
df['Genre_id'] = df.Major_Genre.factorize()[0]
fig = px.parallel_coordinates(
    df,
    dimensions=[
        'IMDB_Rating', 'IMDB_Votes', 'Production_Budget', 'Running_Time_min',
        'US_Gross', 'Worldwide_Gross', 'US_DVD_Sales'
    ],
    color='IMDB_Rating',
    color_continuous_scale=px.colors.sequential.Emrld)
fig.show()


5.图表,传感器和指标




美观需要传感器图。它们是报告成功或绩效指标并将它们与您的目标联系起来的好方法。



指标在业务和咨询方面将非常有用。它们通过吸引观众注意力并向观众广播成长指标的文字来补充视觉效果。

import plotly.graph_objects as go
fig = go.Figure(go.Indicator(
    domain = {'x': [0, 1], 'y': [0, 1]},
    value = 4.3,
    mode = "gauge+number+delta",
    title = {'text': "Success Metric"},
    delta = {'reference': 3.9},
    gauge = {'bar': {'color': "lightgreen"},
        'axis': {'range': [None, 5]},
             'steps' : [
                 {'range': [0, 2.5], 'color': "lightgray"},
                 {'range': [2.5, 4], 'color': "gray"}],
          }))
fig.show()

import plotly.graph_objects as go
fig = go.Figure(go.Indicator(
    title = {'text': "Success Metric"},
     mode = "number+delta",
    value = 300,
    delta = {'reference': 160}))
fig.show()


fig = go.Figure(go.Indicator(
     title = {'text': "Success Metric"},
    mode = "delta",
    value = 40,
 delta = {'reference': 160}))
fig.show()

就这样!


希望您找到对自己有用的东西。待在家里,要安全,高效地工作。



了解有关该课程的更多信息。



All Articles