使用 Plotly 创建专业可视化时你应该知道的七个关键功能

news2024/11/13 9:38:27

        欢迎来到雲闪世界。我们习惯于在在线报纸上看到交互式可视化,并且我们经常想知道数据记者使用什么工具来创建这些看起来专业的可视化。事实是,创建这种类型的可视化不需要任何特殊软件;Python 中的大多数交互式可视化库都是高度可定制的,允许从设计角度创建高质量的可视化。在本文中,我们将逐步展示如何自定义在 Plotly 中创建的交互式可视化,只需进行一些调整即可显著改善其设计。

原始可视化

在本文中,我们将使用一个简单的可视化,例如变量的时间演变。要可视化的数据对应于 1800 年至 2020 年的德国人口。首先,我们将使用 Plotly 创建最简单的数据可视化,无需任何自定义。随后,我们将逐步解释所使用的所有自定义,并在本文末尾提供改进的可视化代码。

       您可以下载包含数据的文件并在您的计算机上运行本文中的代码,以获得与本文中所示的相同结果。此外,您可以继续自定义以进一步改善可视化。

首先,我们下载数据并将其存储在 Pandas DataFrame 中。

# Read the data into a Pandas DataFrame
df = pd.read_excel('statistic_id1066918_population-of-germany-1800-2020.xlsx', sheet_name='Data', skiprows=4)

# Selection of the columns 1 and 2
df = df.iloc[:, 1:3]

# Rename the columns
df.columns = ['Year', 'Population']

# Visualize the first rows of the DataFrame
df.head()
包含德国人口的数据框

我们从在 Plotly 中创建的简单可视化开始;在本例中,可视化由一条折线图组成,无需额外的定制。

# Create a line plot using Plotly Graph Objects
fig = go.Figure()

fig.add_trace(go.Scatter(
    x=df['Year'],
    y=df['Population'],
    mode='lines',
    name='Population',
))

# Update the layout of the visualization
fig.update_layout(
    title='Population Growth in Germany: 1800-2020',
    width=850,  
    height=500,
)

fig.show()

原创剧情,无需定制

创建专业可视化的关键功能

本文的目的是美化原始可视化,使其看起来更专业,风格类似于《金融时报》等报纸上的可视化。接下来,我们将逐步解释为转换可视化并使其更具视觉吸引力而应用的每一种技术。

直接贴标

直接标签是一种在可视化中突出显示特定信息的简单方法。在此示例中,目标是突出显示从 1800 年到 2020 年的一段时间内德国人口的开始和结束。可以使用悬停来观察其余点的信息。如下面的代码所示,直接标签是通过在兴趣点处添加注释来实现的。此外,已删除 y 轴标签以避免可视化过载,因为可以从直接标签和悬停中获得值。

阴影区域

当我们创建反映时间演变的可视化时,在图表上突出显示某些事件有时很有趣,可以提供背景信息。有时,这些事件发生在特定的一天,因此使用垂直线进行可视化;然而,在其他情况下,事件发生在一段时间内,应该使用阴影区域进行可视化。

字幕

报纸中的可视化通常有一个标题和一个副标题。其中一个通常解释可视化中显示的内容,而另一个则传达可视化提供的关键见解。注释用于在图形中创建副标题,如下面的代码所示。重要的部分是调整 x 和 y 坐标以将注释置于标题下方。另一个重要方面是使用比标题更小的字体创建副标题,如可视化中所示。

页脚

报纸或杂志中的许多可视化通常具有的另一个功能是有关数据源的信息,这些信息放置在图表下方的页脚中。这与副标题一样,使用注释来完成。与以前一样,需要找到适当的 x 和 y 坐标,以正确放置注释。另一个重要方面是字体大小,页脚的字体大小通常小于副标题的字体大小。

自定义悬停效果

默认的悬停效果只是一个包含 x 和 y 值的元组,如本文开头的原始图片所示。这些可以自定义以创建更详细的悬停效果。在本例中,创建了一个带有两条线的悬停效果:一条表示年份,另一条表示人口。此悬停效果比默认创建的悬停效果专业得多。

字体类型

Plotly 中的默认字体是 Open Sans。这种字体看起来非常专业;但是,有时您可能需要使用其他字体类型自定义可视化。我非常喜欢圆形字体,主要是因为我认为它们看起来既专业又现代。出于这个原因,我决定在可视化中使用一种名为 Rubik 的字体。在我看来,Poppins、Aptos 和 Rubik 是可视化中最现代、最专业的字体。您还可以尝试其他字体,具体取决于特定项目的需求或偏好。

背景和网格

设计良好可视化的关键原则之一是仅使用墨水来表示数据。因此,良好的可视化设计应避免不必要地使用墨水。遵循此准则,我们可以在可视化中实施更改,例如删除背景或网格,因为这些元素不提供任何附加信息。

定制可视化

以下代码显示了之前实施的所有更改。我邀请您根据自己的喜好尝试其他更改。事实是,Plotly 是提供更高质量和高度可定制可视化的 Python 库之一。此外,这些可视化可以轻松地用于 Web 应用程序(例如使用 Streamlit 制作的应用程序)。

# Create a line plot using Plotly Graph Objects
fig = go.Figure()

# Define the color for the line and markers
line_color = 'steelblue'

# Line Plot
fig.add_trace(go.Scatter(
    x=df['Year'],
    y=df['Population'],
    mode='lines',
    name='Population',
    hovertemplate='Year: %{x}<br>Population: %{y}<extra></extra>', # Customized hover over
        hoverlabel=dict(
        font=dict(
            family='Rubik', # Customized font family of the hover over
            size=14,
        )
    ),
    line=dict(width=4, color=line_color),
    showlegend=False
))

# Highlight markers at the beginning and end
fig.add_trace(go.Scatter(
    x=[df['Year'].iloc[0], df['Year'].iloc[-1]],
    y=[df['Population'].iloc[0], df['Population'].iloc[-1]],
    mode='markers',
    name='Population',
    marker=dict(size=12, color=line_color), 
    showlegend=False  
))

# Annotations for the markers (direct labeling)
direct_labels = [
    dict(x=df['Year'].iloc[0] - 0.005 * df['Year'].iloc[0], y=df['Population'].iloc[0],
         xref='x', yref='y',
         text=str(df['Population'].iloc[0]),
         showarrow=False,
         font=dict(size=14, color=line_color)),
    dict(x=df['Year'].iloc[-1] + 0.005 * df['Year'].iloc[-1], y=df['Population'].iloc[-1],
         xref='x', yref='y',
         text=str(df['Population'].iloc[-1]),
         showarrow=False,
         font=dict(size=14, color=line_color))
]

# Shape areas annotations
shape_labels = [
        dict(x=1919, y=1.015, 
             xref='x', yref='paper',
             xanchor='left',
             text='WWI',
             showarrow=False,
             font=dict(size=12, color='grey')),
        dict(x=1945, y=1.015, 
             xref='x', yref='paper',
             xanchor='left',
             text='WWII',
             showarrow=False,
             font=dict(size=12, color='grey'))
]

# Subtitle annotations
subtitle_annotation = [dict(
    x=-0.06,
    y=1.125,
    xref='paper',
    yref='paper',
    text='The Remarkable Increase from 18 Million to 83 Million Over 220 Years',
    showarrow=False,
    font=dict(size=14, color='grey'),
    xanchor='left'
)]

# Footer annotations
footer_annotation = [dict(
    x=-0.06,
    y=-0.20,
    xref='paper',
    yref='paper',
    text='Source: <a href="https://www.statista.com/statistics/1066918/population-germany-historical/" target="_blank">Statista</a>. Retrieved July 14, 2024.',
    showarrow=False,
    font=dict(size=12, color='grey'),
    xanchor='left'
)]

fig.update_layout(
    shapes=[
        dict(
            type='rect',
            xref='x',
            yref='paper',
            x0=1914.6,
            y0=0,
            x1=1918.9,
            y1=1,
            fillcolor='rgba(0, 0, 0, 0.1)',
            layer='below',
            line=dict(width=0),
        ),
         dict(
            type='rect',
            xref='x',
            yref='paper',
            x0=1939.75,
            y0=0,
            x1=1945.75,
            y1=1,
            fillcolor='rgba(0, 0, 0, 0.1)',
            layer='below',
            line=dict(width=0),
        ) # Shaded areas
    ],
    title='Population Growth in <span style="color: steelblue; font-weight: bold;">Germany</span>: 1800-2020',
    xaxis_title='Year',
    yaxis_title='',
    yaxis=dict(showgrid=False, showticklabels=False),
    xaxis=dict(showgrid=False),  
    width=850,  
    height=500,
    plot_bgcolor='rgba(0,0,0,0)', 
    font=dict(family='Rubik'), # Customized font family of the visualization
    annotations=direct_labels + shape_labels + subtitle_annotation + footer_annotation # Include all labels in the visualization
)

fig.show()

定制地块

采用专业风格设计的 Plotly 可视化

在本文中,我们介绍了七种可用于创建专业可视化的功能,这些功能类似于您在报纸和在线出版物中看到的可视化,使用 Plotly。使用这些简单的方法,您可以使您的可视化看起来更加专业。在给定的示例中,它们已应用于折线图。不过,事实是,这些功能可以应用于各种可视化,从而显著提高其质量。我鼓励您在可视化中将它们付诸实践!

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

订阅频道(https://t.me/awsgoogvps_Host)
TG交流群(t.me/awsgoogvpsHost)

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

 订阅频道(https://t.me/awsgoogvps_Host)
 TG交流群(t.me/awsgoogvpsHost)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1988342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion史诗级更新! WebUI 1.10.0时代来了!

前言 大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 前几天 AUTOMATIC1111 发布了Stable Diffusion WebUI 1.10&#xff0c;我也在第一时间将云环境的镜像升级到了最新版本&#xff0c;有兴趣的同学可以去体验下&#xff0c;目前已经发布到了AutoDL&#xff0c;…

博客趣二维码生成器网站源码

这款二维码生成源码可以把电子名片、文本、wifi网络、电子邮件、短信、电话号码、网址等信息生成对应的二维码图片。地图位置二维码生成使用是谷歌地图的api地址&#xff0c;懂程序的可以改成国内地图http://www.bokequ.com/588.html

CST软件如何添加和管理自定义的材料?

经常有用户想手动添加材料到CST软件的材料库&#xff0c;或让CST软件指向自定义的材料库&#xff0c;由于CST软件没有自动追踪用户材料数据的功能&#xff0c;这里就需要用户知道一些小技巧&#xff0c;不然看不到这些材料哦 1. 材料库的路径&#xff1a; 首先解释材料库…

Django中事务的基本使用

1. Django事务处理 事务(Transaction): 是一种将多个数据库操作组合成一个单一工作单元的机制. 如果事务中的所有操作都成功完成, 则这些更改将永久保存到数据库中. 如果事务中的某个操作失败, 则整个事务将回滚到事务开始前的状态, 所有的更改都不会被保存到数据库中. 这对于…

流媒体服务器XMedia插件服务安装使用

XMedia是AMS流媒体服务器的一个插件服务&#xff0c;可以扩展支持 FLV 、GB28181上传、WEBRTC、SRT协议上传&#xff0c;增强了服务器的功能 一、服务插件安装 资源下载 XMedia-CentOS7-x86-64-20240710-212007 把安装包放入LINUX服务器&#xff0c;执行如下命令,如果未安装u…

因子分析和非负矩阵分解

因子分析 (Factor Analysis, FA) 因子分析是一种统计方法&#xff0c;用于通过少量潜在变量&#xff08;因子&#xff09;解释观测数据中的相关结构。它在数据降维、特征提取和变量选择中广泛应用。 原理 因子分析假设观测变量是由少数潜在因子线性组合并加上噪声得到的。通…

Stable Diffusion 使用详解(6)---人物风格及背景变换

目录 背景 ControlNet lineart IP-Adapter 实例 生成场景模特 操作 生成效果 生成背景 操作 生成效果 融合 ip-adaptor contrlNet lineart controlNet 生成效果 背景 很多场景下&#xff0c;需要完成人物风格变换&#xff0c;比如现在是写真集&#xff0c;想转…

『 Linux 』网络基础

文章目录 协议分层OSI 七层模型TCP/IP 四层(五层)模型网络协议栈与操作系统的联系报文TCP/IP 通讯过程以太网通信的过程以太网的数据碰撞 协议分层 协议分层是计算机网络中奖网络协议进行组织和管理的方法; 通过将网络通信过程分成多个层次,每个层次负责特定的功能从而简化网络…

打破视频生成难题,腾讯提出 MimicMotion引领AI模仿人体动作新纪元

该论文提出了一种可控的视频生成框架MimicMotion&#xff0c;能够生成高质量且任意长度的视频&#xff0c;模仿特定的运动指导。该研究引入信心感知姿势指导&#xff0c;确保视频帧的高质量和时间平滑性。同时&#xff0c;还引入了基于姿势信心的区域性损失放大策略&#xff0c…

hashmap底层原理(数据结构 put原理 get原理 remove原理)

目录 一、数据结构 二、put原理 进入put方法 第一步&#xff1a;通过 HashMap 自己提供的hash 算法算出当前 key 的hash 值 第二步&#xff1a; 进入putVal(hash(key), key, value, false, true) 第三步&#xff1a; resize 完整源码 putval resize 流程图​ 三、get原…

如何不需要通过试单(多单未成功)来关闭被禁用的PayPal账号

轮询自检系统 可以最大程度不浪费订单&#xff0c;当你的PayPal被禁止收单时&#xff0c;无需通过试单(多单不成功)功能来关闭你的账号&#xff0c;极大的保证订单的成功率。 除了在接单时候系统自检&#xff0c;我们还提供一个批量检测PayPal账号系统&#xff0c;可大批量的检…

【运维自动化-配置平台】平台管理功能如何使用

蓝鲸智云配置平台&#xff0c;以下简称配置平台 配置平台里的平台管理功能是管理员的一些操作&#xff0c;比如一些全局纬度的设置1、全局配置-业务通用 业务快照名称&#xff1a;通常不需要修改&#xff0c;保持平台搭建好默认业务&#xff08;蓝鲸&#xff09;即可 拓扑最大…

主从备份及安装准备

主从复制 学习内容 1. 备份的三种类型 1. 热备份 2. 逻辑备份 3. 物理备份 2. 情景 ⼊职企业&#xff0c;发现企业架构为⼀主多从&#xff0c;但是两台从服务器和主库不同 步&#xff0c;但是每天会全库北⽅主服务器上的数据到从服务器&#xff0c;由于数据量 不是很⼤&a…

C++校园线上点餐系统-计算机毕业设计源码82032

摘要 本论文旨在设计并实现一种基于C语言的校园线上点餐系统&#xff0c;以解决校园内学生和教职员工点餐的便利性问题。该系统采用C语言作为主要开发语言&#xff0c;结合文件操作、数据结构和用户界面设计等技术&#xff0c;实现了一个功能完善的点餐系统。 论文介绍了校园线…

【书生大模型实战营第三期 | 基础岛第2关-8G 显存玩转书生大模型 Demo】

学习心得&#xff1a;8G 显存玩转书生大模型 Demo 摘要 本文是对《8G 显存玩转书生大模型 Demo》文档的学习心得。通过阅读文档&#xff0c;我了解了如何在有限的硬件资源下部署和使用大型语言模型&#xff0c;包括InternLM2-Chat-1.8B、InternLM-XComposer2-VL-1.8B和Intern…

langchain实现大模型结构化输出

文章目录 前言大模型对话函数返回列表格式返回对象类型返回对象格式&#xff08;信息抽取&#xff09;返回json格式做选择题&#xff08;在给定答案中选一个答案&#xff09; 前言 这里大模型使用GLM4。 结构化输出的稳定性与大模型的能力挂钩 听话的就容易出 不听话的就容易报…

SQL布尔盲注

目录 1 布尔盲注 2布尔盲注流程 2.1输入id进行测试 2.2判断注入类型 2.3爆数据库名 2.4爆表名 2.5爆字段名 2.6查询数据 1 布尔盲注 布尔盲注就是在SQL注入过程中&#xff0c;SQL语句执行后&#xff0c;查询到的数据不能回显到前端页面&#xff0c;如果正确执行了构造的…

连接一切:Web3如何重塑物联网的未来

传统物联网的挑战 物联网&#xff08;IoT&#xff09;正在迅速改变我们的世界&#xff0c;通过将各种设备连接到互联网&#xff0c;它使得设备能够相互交流&#xff0c;提供智能化的服务和解决方案。然而&#xff0c;随着物联网的迅猛发展&#xff0c;安全性、隐私保护和设备互…

C++ primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化

C primer plus 第17 章 输入、输出和文件&#xff1a;文件输入和输出05:文件模式:内核格式化 C primer plus 第17 章 输入、输出和文件&#xff1a;文件输入和输出05:文件模式:内核格式化 17.5 内核格式化 程序清单 17.21 strout.cpp 文章目录 C primer plus 第17 章 输入、输…

第41届CCF

第41届CCF中国数据库学术会议 NDBC2024中国乌鲁木齐 《电信领域数据库新需求与挑战》分论坛介绍 2024年08月09日上午09:00-12:30 电信领域进入算力网络时代,数据库国产化需求迫切,对数据库可用性、扩展性、一体化、多模、跨域传输和调度等提出新的要求。基于此,本论坛重点讨…