1个数据可视化的「百搭套路」,从此打开新思路
Posted 虾米小馄饨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1个数据可视化的「百搭套路」,从此打开新思路相关的知识,希望对你有一定的参考价值。
引言
针对不同的数据类型和数据任务,我们应该如何选择合适的数据可视化?
本文整理了数据可视化的经典套路,希望对你有所启发。
数据分类
首先,我们对数据类型进行分析。
基于任务分类学的数据类型(Data Type By Task Taxonomy, TTT)中将数据分为7类,即一维线性数据、二维数据、三维数据、多维数据、时间数据、树型数据和网状数据1,这七种数据类型所反映的是对现实的抽象。
其中一维数据、二维数据、三维数据、时间数据大家都很熟悉,这里不做赘述。
-
多维数据: 一般有多个属性字段,可以表示为高维空间的一个点,然后用三维散点图进行可视化。
-
树结构: 一般用来表达层次关系,是一种常用的非线性数据结构。
-
网状数据/图结构: 一般用来表达连接关系,也是一种常用的非线性数据结构,常用节点连接图及连接矩阵进行表示。网状数据(图结构)常用来表现自然世界和社会关系中的包含和从属关系、组织信息和逻辑承接关系等。
⭐️ 可视化方法选型
确定数据类型之后,根据常见的数据可视化需求,我们可以把可视化目标分为比较、关系、分布、组合四大类。
下图总结了根据需求分析可采用的统计可视化方法。2
✋ 可视化之前的数据处理
在进行数据分析和可视化之前,通常要对复杂数据进行预处理,常见数据处理如下2。
-
合并:将两个以上的属性合并成一个属性或对象,包括有效简化数据、改变数据尺度。
-
采样:采样是统计学的基本方法,也是对数据进行选择的主要手段,对数据的初步探索和最后的数据分析环节经常被采用。
-
降维:维度越高,数据集在维度空间的分布越稀疏,从而减弱了数据集的密度和距离的定义对数据聚类和离群值检测等操作的影响。将数据属性的维度降低,有助于解决维度灾难,减少数据处理的时间和内存消耗,更为有效地可视化数据,降低噪声或消除无关特征等。
-
特征子集选择:从数据集中选择部分数据属性值可以消除冗余的特征、与任务无关的特征,包括暴力枚举法、特征重要性选择、压缩感知理论的稀疏表达方法。
-
特征生成:特征生成是指在原始数据的基础上构建新的能反映数据集重要信息的属性,包括特征抽取、将数据应用到新空间、基于特征融合与特征变换的特征构造。
-
离散化与二值化:将数据集根据分布划分为若干个子类,形成对数据集的离散表达。
-
属性变换:将某个属性的所有的可能值一一映射到另一个空间,如指数变换、取绝对值等。
✍ 常用可视化代码(python)
数据预处理完成之后,数据可视化既可以自己编程实现,也可以借助现有的可视化工具。
下面整理了双变量/多变量进行可视化分析的常用代码,基于matplotlib和seaborn实现。3
数据概览
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
df=sns.load_dataset('titanic')
# 查看前5条数据
df.head()
# 查看数据量
print(df.shape)
# 查看数值型变量的统计信息,包括数量、均值、标准差、最大最小值、分位数
df.describe()
相关性图
相关性图可以反映两个变量之间的相关方向,在绘图中还需要增加相关系数,以更直观地判断相关程度。
from scipy.stats import pearsonr
sns.jointplot(x="pclass",y="age",data=df,kind="reg",stat_func=pearsonr)
热力图
热力图通过色块的颜色、深浅来表示不同变量之间的相关性。
f=df[['age','fare','sibsp']].corr()
sns.heatmap(f,annot=True)
边际直方图
# Import Data
df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")
# Create Fig and gridspec
fig = plt.figure(figsize=(16, 10), dpi= 80)
grid = plt.GridSpec(4, 4, hspace=0.5, wspace=0.2)
# Define the axes
ax_main = fig.add_subplot(grid[:-1, :-1])
ax_right = fig.add_subplot(grid[:-1, -1], xticklabels=[], yticklabels=[])
ax_bottom = fig.add_subplot(grid[-1, 0:-1], xticklabels=[], yticklabels=[])
# Scatterplot on main ax
ax_main.scatter('displ', 'hwy', s=df.cty*4, c=df.manufacturer.astype('category').cat.codes, alpha=.9, data=df, cmap="tab10", edgecolors='gray', linewidths=.5)
# histogram on the right
ax_bottom.hist(df.displ, 40, histtype='stepfilled', orientation='vertical', color='deeppink')
ax_bottom.invert_yaxis()
# histogram in the bottom
ax_right.hist(df.hwy, 40, histtype='stepfilled', orientation='horizontal', color='deeppink')
# Decorations
ax_main.set(title='Scatterplot with Histograms \\n displ vs hwy', xlabel='displ', ylabel='hwy')
ax_main.title.set_fontsize(20)
for item in ([ax_main.xaxis.label, ax_main.yaxis.label] + ax_main.get_xticklabels() + ax_main.get_yticklabels()):
item.set_fontsize(14)
xlabels = ax_main.get_xticks().tolist()
ax_main.set_xticklabels(xlabels)
plt.show()
成对图
# Load Dataset
df = sns.load_dataset('iris')
# Plot
plt.figure(figsize=(10,8), dpi= 80)
sns.pairplot(df, kind="reg", hue="species")
plt.show()
密度曲线+直方图
# Import Data
df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")
# Draw Plot
plt.figure(figsize=(13,10), dpi= 80)
sns.distplot(df.loc[df['class'] == 'compact', "cty"], color="dodgerblue", label="Compact", hist_kws={'alpha':.7}, kde_kws={'linewidth':3})
sns.distplot(df.loc[df['class'] == 'suv', "cty"], color="orange", label="SUV", hist_kws={'alpha':.7}, kde_kws={'linewidth':3})
sns.distplot(df.loc[df['class'] == 'minivan', "cty"], color="g", label="minivan", hist_kws={'alpha':.7}, kde_kws={'linewidth':3})
plt.ylim(0, 0.35)
# Decoration
plt.title('Density Plot of City Mileage by Vehicle Type', fontsize=22)
plt.legend()
plt.show()
网络可视化
树结构、图结构的可视化,可以用networkx来实现4。
import matplotlib.pyplot as plt
import networkx as nx
G = nx.petersen_graph()
subax1 = plt.subplot(121)
nx.draw(G, with_labels=True, font_weight='bold')
subax2 = plt.subplot(122)
nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='bold')
⭐️ 常用可视化工具
除了自己编程实现,我们也可以借助成熟的可视化软件,快速制作漂亮的图表。
Microsoft Excel
Office Power Map示例
Microsoft Power Map for Excel可以在三维地球或自定义地图上绘制地理和时态数据,显示这些数据,并创建可以与其他人分享的视觉浏览。
ECharts
https://echarts.apache.org/zh/index.html
国产可视化库,应用广泛,免费,开源。
Tableau
https://www.tableau.com/
BI领域常用的可视化平台,全球范围应用很广的一款商业软件。
Visualization Free
https://www.visualizefree.com/
一款免费的可视化工具,可以通过拖放设计器构建交互式可视化。
👉 经典可视化案例
-
风、气象、海洋状况的全球地图:https://earth.nullschool.net/zh-cn/
-
标签云制作: https://tagul.com/
-
全球最牛的28个大数据可视化应用案例:http://www.open-open.com/news/view/154a034/
-
地理信息可视化开源库:http://mapv.baidu.com/
👉 小结
本文整理了数据可视化分析的整体思路,提供了常用代码和可视化工具。
下次面对数据分析任务,就可以参考可视化方法选型中的思路,根据你的需求,选择适当的图表进行可视化。
如果想要更漂亮的展示效果,可以借助成熟的可视化工具。
如果这篇文章对你有用的话,欢迎一键三连支持下博主~
以上是关于1个数据可视化的「百搭套路」,从此打开新思路的主要内容,如果未能解决你的问题,请参考以下文章