数据埋点系列 16| 数据可视化高级技巧:从洞察到视觉故事

news2024/11/16 15:58:18

数据可视化是将复杂数据转化为直观、易懂的视觉表现的艺术和科学。本文将探讨一些高级的数据可视化技巧,帮助您创建更具吸引力和洞察力的数据展示。
image.png

目录

    • 1. 高级图表类型
      • 1.1 桑基图(Sankey Diagram)
      • 1.2 树状图(Treemap)
    • 2. 交互式可视化
      • 2.1 使用Bokeh创建交互式散点图
    • 3. 地理空间可视化
      • 3.1 使用Folium创建交互式地图
    • 4. 数据叙事技巧
      • 4.1 创建数据故事板
    • 5. 可视化设计原则
    • 6. 高级配色技巧
    • 7. 最佳实践
    • 结语

1. 高级图表类型

除了常见的条形图、折线图和饼图,还有许多高级图表类型可以更好地展示复杂的数据关系。
image.png

1.1 桑基图(Sankey Diagram)

image.png

桑基图用于显示复杂的流程和数量关系。

import plotly.graph_objects as go

def create_sankey_diagram(nodes, links):
    fig = go.Figure(data=[go.Sankey(
        node = dict(
          pad = 15,
          thickness = 20,
          line = dict(color = "black", width = 0.5),
          label = nodes,
          color = "blue"
        ),
        link = dict(
          source = links['source'],
          target = links['target'],
          value = links['value']
    ))])

    fig.update_layout(title_text="Sankey Diagram", font_size=10)
    fig.show()

# 使用示例
nodes = ["A", "B", "C", "D", "E"]
links = {
    'source': [0, 0, 1, 2, 3],
    'target': [2, 3, 4, 4, 4],
    'value': [8, 4, 2, 8, 4]
}
create_sankey_diagram(nodes, links)

1.2 树状图(Treemap)

树状图用于展示层级数据结构和比例关系。
image.png

import plotly.express as px
import pandas as pd

def create_treemap(data):
    fig = px.treemap(data, path=['Category', 'SubCategory'], values='Value',
                     color='Value', color_continuous_scale='RdBu',
                     title='Product Categories Treemap')
    fig.show()

# 使用示例
data = pd.DataFrame({
    'Category': ['Electronics', 'Electronics', 'Clothing', 'Clothing'],
    'SubCategory': ['Phones', 'Laptops', 'Shirts', 'Pants'],
    'Value': [500, 800, 300, 200]
})
create_treemap(data)

image.png

2. 交互式可视化

交互式可视化允许用户探索数据,发现更深层次的洞察。
image.png

2.1 使用Bokeh创建交互式散点图

from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, HoverTool
import pandas as pd
import numpy as np

def create_interactive_scatter(data):
    source = ColumnDataSource(data)

    p = figure(title="Interactive Scatter Plot", x_axis_label='X', y_axis_label='Y')
    p.circle('x', 'y', size=10, color='color', alpha=0.5, source=source)

    hover = HoverTool(tooltips=[
        ("X", "@x"),
        ("Y", "@y"),
        ("Category", "@category")
    ])
    p.add_tools(hover)

    show(p)

# 使用示例
np.random.seed(42)
data = pd.DataFrame({
    'x': np.random.rand(100),
    'y': np.random.rand(100),
    'category': np.random.choice(['A', 'B', 'C'], 100),
    'color': np.random.choice(['red', 'blue', 'green'], 100)
})
create_interactive_scatter(data)

3. 地理空间可视化

地理空间可视化帮助我们理解数据的地理分布。

3.1 使用Folium创建交互式地图

import folium
import pandas as pd

def create_interactive_map(data):
    m = folium.Map(location=[data['Latitude'].mean(), data['Longitude'].mean()], zoom_start=4)

    for idx, row in data.iterrows():
        folium.Marker(
            location=[row['Latitude'], row['Longitude']],
            popup=f"City: {row['City']}, Value: {row['Value']}"
        ).add_to(m)

    return m

# 使用示例
data = pd.DataFrame({
    'City': ['New York', 'Los Angeles', 'Chicago', 'Houston'],
    'Latitude': [40.7128, 34.0522, 41.8781, 29.7604],
    'Longitude': [-74.0060, -118.2437, -87.6298, -95.3698],
    'Value': [100, 80, 60, 40]
})
interactive_map = create_interactive_map(data)
interactive_map.save("interactive_map.html")
print("地图已保存为 interactive_map.html")

4. 数据叙事技巧

数据叙事是将数据可视化与故事讲述相结合的艺术。

4.1 创建数据故事板

import matplotlib.pyplot as plt
import seaborn as sns

class DataStoryboard:
    def __init__(self, title):
        self.title = title
        self.figures = []

    def add_plot(self, plot_func, data, **kwargs):
        fig, ax = plt.subplots()
        plot_func(data=data, ax=ax, **kwargs)
        self.figures.append(fig)

    def show_story(self):
        n = len(self.figures)
        fig, axes = plt.subplots(n, 1, figsize=(12, 6*n))
        fig.suptitle(self.title, fontsize=16)

        for i, (ax, story_fig) in enumerate(zip(axes, self.figures)):
            ax.imshow(story_fig.canvas.renderer.buffer_rgba())
            ax.axis('off')
            ax.set_title(f"Step {i+1}", fontsize=14)

        plt.tight_layout()
        plt.show()

# 使用示例
np.random.seed(42)
data = pd.DataFrame({
    'X': np.random.normal(0, 1, 1000),
    'Y': np.random.normal(0, 1, 1000),
    'Category': np.random.choice(['A', 'B', 'C'], 1000)
})

story = DataStoryboard("Data Exploration Journey")
story.add_plot(sns.histplot, data['X'], kde=True)
story.add_plot(sns.scatterplot, data, x='X', y='Y', hue='Category')
story.add_plot(sns.boxplot, data, x='Category', y='Y')
story.show_story()

image.png

5. 可视化设计原则

遵循这些设计原则可以创建更有效的数据可视化:
image.png

  1. 简洁性:去除不必要的视觉元素
  2. 清晰性:确保数据准确表达
  3. 效率性:选择最适合数据的图表类型
  4. 美观性:使用协调的配色和布局
class VisualizationPrinciples:
    def __init__(self):
        self.principles = [
            "简洁性",
            "清晰性",
            "效率性",
            "美观性"
        ]
    
    def apply_principle(self, principle, visualization):
        if principle in self.principles:
            print(f"应用{principle}原则到可视化 '{visualization}'")
            # 这里可以添加具体的应用步骤
        else:
            print(f"未知的可视化原则: {principle}")
    
    def evaluate_visualization(self, visualization):
        print(f"\n评估可视化 '{visualization}' 的设计原则应用情况:")
        scores = {}
        for principle in self.principles:
            score = float(input(f"请为'{principle}'原则的应用情况打分(0-10): "))
            scores[principle] = score
        
        average_score = sum(scores.values()) / len(scores)
        print(f"\n设计原则应用平均得分: {average_score:.2f}/10")
        
        if average_score < 6:
            print("建议: 需要显著改进可视化设计")
        elif average_score < 8:
            print("建议: 可视化设计良好,但仍有提升空间")
        else:
            print("建议: excellent的可视化设计,继续保持并创新")

# 使用示例
principles = VisualizationPrinciples()
principles.apply_principle("简洁性", "销售趋势图")
principles.evaluate_visualization("销售趋势图")

6. 高级配色技巧

选择正确的配色方案可以大大提升可视化的效果。

import matplotlib.pyplot as plt
import seaborn as sns

def demonstrate_color_palettes():
    palettes = ['deep', 'muted', 'pastel', 'bright', 'dark', 'colorblind']
    
    fig, axes = plt.subplots(len(palettes), 1, figsize=(10, 3*len(palettes)))
    fig.suptitle("Seaborn Color Palettes", fontsize=16)
    
    for i, palette in enumerate(palettes):
        sns.palplot(sns.color_palette(palette), ax=axes[i])
        axes[i].set_title(palette)
    
    plt.tight_layout()
    plt.show()

demonstrate_color_palettes()

7. 最佳实践

image.png

以下是一些数据可视化的最佳实践:

  1. 了解你的受众
  2. 选择正确的图表类型
  3. 保持一致性
  4. 使用有意义的标签和标题
  5. 提供上下文
  6. 重视可访问性
  7. 迭代和获取反馈
class VisualizationBestPractices:
    def __init__(self):
        self.practices = [
            "了解你的受众",
            "选择正确的图表类型",
            "保持一致性",
            "使用有意义的标签和标题",
            "提供上下文",
            "重视可访问性",
            "迭代和获取反馈"
        ]
    
    def apply_practice(self, practice, visualization):
        if practice in self.practices:
            print(f"在可视化 '{visualization}' 中应用最佳实践: {practice}")
            # 这里可以添加具体的应用步骤
        else:
            print(f"未知的最佳实践: {practice}")
    
    def assess_practices(self, visualization):
        print(f"\n评估可视化 '{visualization}' 的最佳实践应用情况:")
        scores = {}
        for practice in self.practices:
            score = float(input(f"请为'{practice}'的应用情况打分(0-10): "))
            scores[practice] = score
        
        average_score = sum(scores.values()) / len(scores)
        print(f"\n最佳实践应用平均得分: {average_score:.2f}/10")
        
        if average_score < 6:
            print("建议: 需要显著改进最佳实践的应用")
        elif average_score < 8:
            print("建议: 最佳实践应用良好,但仍有提升空间")
        else:
            print("建议: excellent的最佳实践应用,继续保持并创新")

# 使用示例
best_practices = VisualizationBestPractices()
best_practices.apply_practice("选择正确的图表类型", "年度销售报告")
best_practices.assess_practices("年度销售报告")

结语

image.png

高级数据可视化技巧可以帮助我们更有效地传达数据洞察,讲述引人入胜的数据故事。关键是要:

  1. 熟练掌握各种高级图表类型和交互式可视化技术
  2. 理解并应用数据叙事的原则
  3. 遵循可视化设计原则和最佳实践
  4. 不断实践和迭代,根据反馈改进你的可视化

记住,最好的数据可视化不仅仅是美观的图表,更重要的是它能够有效地传达信息,引导观众理解数据背后的洞察。通过持续学习和应用这些高级技巧,你可以创建出既美观又有洞察力的数据可视化,为你的数据分析增添更多价值。

在数据驱动的世界里,那些能够有效利用数据可视化技巧的人将在沟通和决策制定中占据优势。通过将复杂的数据转化为清晰、引人入胜的视觉故事,你可以更好地影响决策,推动变革,并从数据中释放更多价值。

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

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

相关文章

3、目标定位(视觉测距)

目标定位的目的&#xff1a;获取物品相对于视觉模块的三维坐标&#xff0c;并将其转换为物品相对于机械臂坐标原点的三维坐标。 要获取物品三维坐标&#xff0c;则首先要测量物品距离摄像头的距离&#xff0c;又因为摄像头安装在机械臂末端上方&#xff0c;所以获取物品相对于摄…

基于springboot的高校学生服务平台的设计与实现--附源码91686

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能分析 …

代码随想录算法训练营第二十天| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

目录 一、LeetCode 235. 二叉搜索树的最近公共祖先思路&#xff1a;C代码 二、LeetCode 701.二叉搜索树中的插入操作思路C代码 三、LeetCode 450.删除二叉搜索树中的节点思路C代码 总结 一、LeetCode 235. 二叉搜索树的最近公共祖先 题目链接&#xff1a;LeetCode 235. 二叉搜…

C语言:for、while、do-while循环语句

目录 前言 一、while循环 1.1 while语句的执行流程 1.2 while循环的实践 1.3 while循环中的break和continue 1.3.1 break 1.3.2 continue 二、for循环 2.1 语法形式 2.2 for循环的执行流程 2.3 for循环的实践 2.4 for循环中的break和continue 2.4.1 break 2.4.2 …

Java数组03:数组边界、数组的使用

本节内容视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p55&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p55&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.数组边界 数组下标的合法区间[ 0, Len…

综合监管云平台存在信息泄露漏洞_中科智远综合监管云平台

0x01阅读须知 本文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考。本文章仅用于信息安全防御技术分享&#xff0c;因用于其他用途而产生不良后果,作者不承担任何法律责任&#…

昇腾 - 快速理解AscendCL(Ascend Computing Language)基础概念的HelloWord

昇腾 - 快速理解AscendCL&#xff08;Ascend Computing Language&#xff09;基础概念的HelloWord flyfish AscendCL&#xff08;Ascend Computing Language&#xff09;是一套用于在昇腾平台上开发深度神经网络应用的C语言API库&#xff0c;提供运行资源管理、内存管理、模型…

鸿蒙(API 12 Beta3版)【录像流二次处理(C/C++)】媒体相机开发指导

通过ImageReceiver创建录像输出&#xff0c;获取录像流实时数据&#xff0c;以供后续进行图像二次处理&#xff0c;比如应用可以对其添加滤镜算法等。 开发步骤 导入NDK接口&#xff0c;接口中提供了相机相关的属性和方法&#xff0c;导入方法如下。 // 导入NDK接口头文件#in…

ArcGIS Pro基础:软件的常用设置:中文语言、自动保存、默认底图

上图所示&#xff0c;在【选项】&#xff08;Options&#xff09;里找到【语言】设置&#xff0c;将语言切换为中文选项&#xff0c;记得在安装软件时&#xff0c;需要提前安装好ArcGIS语言包。 上图所示&#xff0c;在【选项】里找到【编辑】设置&#xff0c;可以更改软件默认…

Java面试八股之如何保证消息队列中消息不重复消费

如何保证消息队列中消息不重复消费 要保证消息队列中的消息不被重复消费&#xff0c;通常需要从以下几个方面来着手&#xff1a; 消息确认机制&#xff1a; 对于像RabbitMQ这样的消息队列系统&#xff0c;可以使用手动确认&#xff08;manual acknowledge&#xff09;机制来…

Eureka原理与实践:构建高效的微服务架构

Eureka原理与实践&#xff1a;构建高效的微服务架构 Eureka的核心原理Eureka Server&#xff1a;服务注册中心Eureka Client&#xff1a;服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client&#xff08;服务提供者&…

ISA95 企业控制集成标准

ANSI/ISA-95 企业控制系统集成介绍及其全系列最新标准下载&#xff08;转&#xff09;https://www.cnblogs.com/TonyJia/p/17616347.html ANSI 1. 综述 ISA-95 简称S95&#xff0c;也有称作SP95。ISA-95 是企业系统与控制系统集成国际标准&#xff0c;由国际自动化学会(ISA…

react最好用的swiper插件和拖动插件 react-tiny-slider react-draggable

react移动端项目&#xff0c;其实有挺多的ui框架的&#xff0c;但是我们公司的项目&#xff0c;都是自己封装的ui库&#xff0c;又不可能为了一个轮播图就去再安装一个ui库 所以找了很多的轮播插件&#xff0c;都是不能满足需求 最后找到了它&#xff0c;react-tiny-slider&…

1 什么是linux驱动

1 目录 1 一、什么是linux驱动&#xff1f; 1、驱动的作用 2、 3、驱动的分类 4、linux源码 5、最简单的linux驱动 二、如何编译驱动程序 -- 有两种编译方法&#xff1a; -- 什么是Linux内核模块&#xff1f; -- Linux内核模块的编译 一、什么是linux驱动&#xff…

原生HTML5、CSS、JavaScript实现简易网易云音乐播放

1.效果图 2.源码 1.index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网易云音乐</title><link rel"stylesheet" href"../CSS/index.css"> </head>…

C++:新枚举与新结构

一、枚举 &#xff08;一&#xff09;C枚举&#xff1f;真整数&#xff01; 考虑下面的程序 #include <stdio.h> #include <stdlib.h>typedef enum {spring, summer, autumn, winter} Season;void printSeason(Season season){switch(season){case spring:print…

【Java学习】实现图书管理系统

所属专栏&#xff1a;Java学习 &#x1f341;1. 功能演示 用户分为普通用户和管理员&#xff0c;登录进系统之后可以对图书进行一系列操作&#xff0c;此时我们要明白&#xff0c;对图书的操作是通过书架来执行的&#xff0c;我们平常在图书馆上借书就是在书架上 &#x1f…

简简单单用用perf

实践前提&#xff1a;正确安装 perf 和 FlameGrap。若没安装&#xff0c;心领神会亦可。 1 示例程序 #define m_loop() ({ for(int i0; i < 1000000; i); })void fb(void) {m_loop(); }void fj(void) {fb(); }void fy(void) {m_loop(); }void loop(void) {for (;;) {fy();…

实习教训,永远铭记

1.毕了业宁宁可收入低一点&#xff0c;但一定去那种开发产品有规章制度&#xff0c;有流程规范的公司。 永远不接受小公司&#xff0c;没有任何规范可言的小公司&#xff01;&#xff01;&#xff01;&#xff01; 永远不接受小公司&#xff0c;没有任何规范可言的小公司&…

Docker手动在虚拟机上部署前端、后端和数据库

&#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、项目准备 二、MySQL数据库部署 三、SpringBoot后端部署 四、Vue前端部署 一、项目准备 准备数据库、前端项目、后端项目。 准备一…