本文正在参加「Python主题月」,详情查看活动链接
定义
数据可视化,简单说来,就是将数据图形化。这里的图形,可以再细分为指图表(table)、图形(chart)、动画(animation)。这篇文章只讨论数据的图形化。图形按照你想要传达给外界的意图,可以分为以下几类
1.随时间变化类
2.类别比较类
3.排名类
4.部分-整体类
5.相关类
应用场景
- 数据探查
- 报表展示
数据与图像的关系
将数据转化成图像之前,我们首先要明确数据类型,简单来说可以分为:数字数据(一个变量、两个变量、多个变量)、地图数据、时间序列数据。
不同的数据类型和不同的图形结合,可以从不同角度展示出数据之间的内涵关系,他们之间没有明确的一一对应关系,要根据不同的场景和问题做具体分析。
个人总结一些通用的规律如下:
- 柱状图:看2者的差异(gap)
- 饼图:要排序、右上排到左上,里面标的一定是百分比,外面标的是含义 ; 强调百分比;不要超过6块饼
- 条形图:强调排序;如果有对标,超过一个阈值—虚线;
- 线形图:讲趋势
数据可视化的基本方法
1.解构你的图像。
速写出你想要的图像,明确图像传达的目的,明确使用图表的类型,明确其中的每一部分的结构。
这一步可以用笔在纸上画出一个大概。
2.构建图像的框架
选用你熟悉的编程语言,构建出整张图表
3.美化图表,添加注解
使用python实现数据可视化
seaborn
seaborn是一种基于matplotlib的图形可视化python libraty。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #导入
import seaborn as sns
# 加载数据
tips = sns.load_dataset("tips")
# 使用FaceGrid创建图形框架
grid = sns.FacetGrid(tips, col='time', hue='sex', palette='pastel', height=4)
# 在框架里填充数据
grid.map(sns.scatterplot, 'total_bill','tip')
# 添加图例
grid.add_legend()
复制代码
sns.set_style("white")
# 设置sns内置的取色模式
sns.set_palette("RdBu")
# 如果对于内置的取色不满意,可以自定义取色
custom_palette = ['#B3CDE3','#CCEBC5','#DECBE4','#FED9A6','#FFFFCC','#E5D8BD','#FDDAEC','#F2F2F2']
sns.set_palette(custom_palette)
g = sns.FacetGrid(tips, col="time",palette='husl')
g.map_dataframe(sns.histplot, x="total_bill")
g.set_axis_labels("Total bill", "Count")
#g.add_legend()
g.fig.suptitle("New title",y=1.03)
复制代码
plotly
plotly 是一个交互式的python库 ;与之对比,是静态的pyhon库,比如matplotlib 。plotly的绘制图像有在线和离线两种方式,因为在线绘图需要注册账号获取API key,较为麻烦,所以本文仅介绍离线绘图的方式。
plotly的绘图逻辑如下:
1.定义 trace,类似于 matplotlib 中的坐标轴和图形(例如折线),只管画图
2.定义 data,就是一个 trace 列表,因为可能会同时绘制多个图形,例如多条折线
3.定义 layout,就是布局,标题、margin 等
4.使用 go.Figure 或者 go.FigureWidget 绘图,传入 data 和 layout 参数
利用plotly绘图,我们只需要讲重点放在trace上就可以了,它是我们绘图数据的核心,其他部分基本上无需变化,如果希望对图形做定制化可以在参考文档。
import plotly.graph_objs as go
# 在线格式引入
import plotly.plotly as py
# 离线格式引入
import plotly.offline as of
# 定义trace,数据内容和数据形式
trace1 = go.Scatter(
x = contents.index,
y = contents.num,
mode = "line",
name = "num",
marker = dict(color = 'rgba(80, 26, 80, 0.8)'),
text = contents.str)
trace2 = go.Scatter(
x = contents.index,
y = contents.num2,
mode = "lines+markers",
name = "num2",
marker = dict(color = 'rgba(16, 112, 2, 0.8)'),
text = contents.str)
# 下面这些设置对于固定一种图表的展示基本不用更改,都是一样的
layout = dict(title = '折线图',
xaxis= dict(title= '序号',ticklen= 5,zeroline= False)
)
data = [trace1, trace2]
fig = dict(data = data, layout = layout)
of.iplot(fig)
复制代码