大数据应用导论 Chapter05 | 数据可视化

	本篇博文简单介绍大数据应用的流程中数据可视化的各种工具和使用方法。

一、可视化概述

  • 一图胜千字;一张简单的图标在传递大量信息的同时,能更加直观地阐述观点。可视化历史悠久,最早在墙上、粘土上绘图,随后在纸上。
  • 现代其算计出现后,数据可视化发展迅速,展示方式已超过30种并各有独特地用处。
  • 图形多样:条形图、饼图、箱线图、气泡图、直方图…
  • 绘图工具也多种多样:Matplotlib、Seaborn、Tableau、Echarts等

条形图与直方图能最快地展示数据分布是否均匀。
条形图(bar chart)

  • 纵轴通常代表数量

直方图(histogram)

  • 纵轴通常代表频率
    1
    箱纸图(box plot)
  • 用来展示一个连续数值特征地分布。
    2
    散点图(scatter plot)
  • 散点图是一种图形表达形式,具有描述两个连续型地特征,具有检测离群值地功能。
    3
    气泡图(bubble chart)
  • 展示第三个连续型数值的特征,气泡大小反应特征的大小。
    4
    饼图(pie chart)
  • 饼图是条形图的变种,能很好展示各个分量占总体数的比例。
  • 使用饼图时饼图的分类不宜过多。
    5
    数据可视化工具:
    1、Matplotlib(Python):一个2D绘图库,可以绘制许多高质量的图形
    2、Seaborn(Python):Matplotlib基础上的高级绘图库,运用简单的操作就能够画出较为复杂的图形
    3、Tableau:一个强大的数据可视化工具,可实时进行可视化数据分析和数据探索
    4、Echarts:由百度前端技术部开发的,基于Javascript的数据可视化图表库,提供直观、生动、可交互、可个性化定制的数据可视化图表

二、Matplotlib可视化

1、Matplotlib基本介绍

  • 一个Python的2D绘图库,以各种格式和跨平台交互式环境生成高质量的图形。
  • 仅需几行代码,便可生成条形图、直方图等各种图形。
    6
    Matplotlib官网:https://Matplotlib.org/
    安装:
  • Anaconda环境下:自带matplotlib
  • pip环境下:pip install matplotlib

Matplotlib中最常用的是pyplot子模块:

  • Matplotlib.pyplot是命令行式函数的集合。
  • 每个pyplot函数都会对图形进行一些更改。
  • 引入:import matplotlib.pyplot as plt

2、Matplotlib基本图表函数

1. title():图的标题
2. plot():绘制图表
3. show():展示图表
4. xlabel():X轴命名
5. ylabel():Y轴命名
6. xticks():X轴刻度
7. yticks():Y轴刻度
8. savefig():保存图片

2.1、正弦图像

1、简单的正弦图像

## 忽略警告信息
import warnings
warnings.filterwarnings('ignore')

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2 * np.pi, 2 * np.pi, 200)  #在-2Π和2Π间等距离生成200个点
y = np.sin(x)          # 正弦函数

plt.plot(x,y)		   # 绘制图表
plt.title("sinx")	   # 命名标题
plt.show()			   # 展示图表

7

2、加上坐标轴名称和刻度

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y = np.sin(x)

plt.plot(x,y)
plt.title("sinx")
plt.xlabel("X")        # X轴命名
plt.ylabel("Y")		   # Y轴命名
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
           [r'$-2\pi$', r'$-\pi$',  r'$0$', r'$\pi$',r'$2\pi$'])    # X轴刻度命名

plt.show()

8

3、在一个图中画多条线

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x,y1)
plt.plot(x,y2)
plt.title("sinx&cosx")
plt.xlabel("X")
plt.ylabel("Y")
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
           [r'$-2\pi$', r'$-\pi$',  r'$0$', r'$\pi$',r'$2\pi$'])
plt.show()

9

4、实线变虚线

  • 通过各种函数和参数控制形状、粗细、颜色;坐标轴范围、缩放、平移等。
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

ax=plt.gca()
ax.spines['right'].set_color('none') 
ax.spines['top'].set_color('none') 

ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y1 = np.sin(x)
y2 = np.cos(x)

plt.axis([-3*np.pi,3*np.pi,-1.5,1.5])
plt.plot(x,y1,'b--',label='sinx')
plt.plot(x,y2,'r--',label='cosx')
plt.title("sinx&cosx")
plt.legend(loc='upper left', frameon=False)
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
           [r'$-2\pi$', r'$-\pi$',  r'$0$', r'$\pi$',r'$2\pi$'])

plt.show()

10

5、一界多图

  • 在一个输出界面中画多个图,构造不同的排版

x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y1 = np.sin(x)
y2 = np.cos(x)


plt.subplot(2,2,1)             
plt.plot(x,y1)
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
           [r'$-2\pi$', r'$-\pi$',  r'$0$', r'$\pi$',r'$2\pi$'])


plt.subplot(2,2,2)            
plt.plot(x,y2)
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
           [r'$-2\pi$', r'$-\pi$',  r'$0$', r'$\pi$',r'$2\pi$'])



plt.subplot(2,2,3)             
plt.plot(x,y2)
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
           [r'$-2\pi$', r'$-\pi$',  r'$0$', r'$\pi$',r'$2\pi$'])

plt.subplot(2,2,4)            
plt.plot(x,y1)
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
           [r'$-2\pi$', r'$-\pi$',  r'$0$', r'$\pi$',r'$2\pi$'])


plt.show()

11
2

x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y1 = np.sin(x)
y2 = np.cos(x)

plt.figure(1)
plt.subplot(2, 1, 1)
plt.plot(x, y1)
plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           [r'$-2\pi$', r'$-\pi$', r'$0$', r'$\pi$', r'$2\pi$'])

plt.subplot(2, 1, 2)
plt.plot(x, y2)
plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           [r'$-2\pi$', r'$-\pi$', r'$0$', r'$\pi$', r'$2\pi$'])

plt.savefig('sinx&cosx1', dpi=1000)

plt.figure(2)
plt.subplot(1, 2, 1)
plt.plot(x, y2)
plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           [r'$-2\pi$', r'$-\pi$', r'$0$', r'$\pi$', r'$2\pi$'])

plt.subplot(1, 2, 2)
plt.plot(x, y1)
plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],
           [r'$-2\pi$', r'$-\pi$', r'$0$', r'$\pi$', r'$2\pi$'])

plt.show()

12

2.2、其他图像

导入

import pandas as pd
tips = pd.read_csv('./input/tips.csv')
tips.head()

1、散点图

x = tips['total_bill']
y = tips['tip']
plt.scatter(x,y)
plt.show()

13

2、柱形图

x = tips['size'].value_counts().index.tolist()
y = tips['size'].value_counts().tolist()
plt.bar(x,height = y)
plt.show()

14

3、箱线图

x = tips['tip']
plt.boxplot(x, labels=['tip'])
plt.show()

15

4、饼图

#x为计数,y为标签
x = tips['day'].value_counts().tolist()
y = tips['day'].value_counts().index.tolist()

plt.pie(x, labels=y, autopct='%0.0f%%')
plt.show()

16

2.3、拓展包

  • 除此之外matplotlib有很多拓展包,如mpl_toolkits.mplot3d提供3D绘图
    17

三、Seaborn可视化

1、Seaborn基本介绍

安装:

  • 在终端使用pip安装Seaborn:
  • pip install seadorn
  • 使用conda安装Seaborn:
  • conda install seaborn
  • 使用pip从github上下载:
  • pip install git+https://github.com/mwaskom/seaborn.git

在使用Seaborn前,建议配置的库:

  • Numpy
  • Scipy
  • Matplotlib
  • Pandas

导入Seaborn库:import seaborn as sns

1.1、视图设置

Seaborn其中一个特点是可以设置视图主题

Seaborn中可以选择的主题有五种:

1. darkgrid:灰色风格
2. whilegrid:白色风格
3. dark:黑色
4. while:白色
5. ticks:有刻度的

设置Seaborn主题可用set()函数
18

1.2、颜色设置

Seaborn在颜色设置上也十分方便

有六个默认颜色循环主题:

1. deep
2. muted
3. pastel
4. bright
5. colorblind

19

  • 其中一组常用的颜色是“hls”,有多种颜色可供选择
    20
  • 连续渐变颜色可用于数值型数据:数据值越大,颜色越深
    21
  • 还有用于区别不同类别数据的颜色
    22

2、案例(基本使用方法)

2.1、读取数据

import pandas as pd
tips = pd.read_csv('./input/tips.csv')
tips.head()

23
24

2.2、作图

1、regplot

  • 使用regplot对两个数值变量的关系进行视图
fig, ax = plt.subplots(figsize=(10,8))
sns.set(style="whitegrid",font_scale=2)
ax = sns.regplot(x="total_bill", y="tip",data=tips)
ax.set_xlabel("total bill")
ax.set_ylabel("tip")
ax.set_title("The relationship between total bill and tip")

25

  • 据上图可知,随着总账单的增加,消费也随之增加

2、countplot

对于离散型的数据,Seaborn提供了多种视图方法:

  • countplot:计算每种类别的个数
  • violinplot:查看每种类别对应的连续数据分布

下面以吸烟者和非吸烟者人数的情况对比图进行演示:

fig, ax = plt.subplots(figsize=(10,8))
sns.set(style="whitegrid",font_scale=3)
sns.countplot('smoker',data=tips,palette=sns.color_palette("Blues_d", 2))

26
由上图可知:

  • 吸烟者数量没有非吸烟者数量多
  • 非吸烟者数量约150
  • 吸烟者数量不到100

3、violinplot

以男性和女性在午餐和晚餐的小费情况:

fig, ax = plt.subplots(figsize=(10,8))
sns.set(style="whitegrid",font_scale=2)
sns.violinplot(x="time",y="tip",hue="sex",data=tips,palette=sns.color_palette("Blues_d", 2))

27
由上图可知:

  • 晚餐时间男女性给的小费范围相对午餐时间大
  • 午餐时间小费金额集中在2左右
  • 晚餐时间小费金额集中在3左右
  • 男性比女性给出的小费金额范围较大
  • 女性比男性给出的小费金额较为集中

4、pairplot

Seaborn的pairplot可以快捷展示不同类型对应的数值性数据情况:

#fig, ax = plt.subplots(figsize=(10,8))
sns.set(style="ticks",font_scale=2)
g = sns.pairplot(tips, hue="sex",height=3)

28

  • 斜对角线的图展示了三个变量的分布情况
  • 其他图体现了变量间的关系
  • 直观体现男女在变量分布和变量关系的区别

四、Tableau可视化

关于Tableau可视化,具体可以看我往期的博文:

  • 传送门:
Tableau https://blog.csdn.net/qq_16146103/category_9813151.html
数据可视化 https://blog.csdn.net/qq_16146103/category_9813153.html

五、Seborn绘图案例(源码)

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

tips = pd.read_csv('./input/tips.csv')
tips.head()

29

# 男性和女性相比,谁更慷慨
male = tips[tips['sex'] == 'Male']
female = tips[tips['sex'] == 'Female']

sns.barplot(x=['male', 'female'], y=[male['tip'].mean(), female['tip'].mean()])
# 男性更加慷慨一些
# 男性性别上的慷慨

30

# 抽烟的人和不抽烟的人相比,谁更慷慨
smoker = tips[tips['smoker'] == 'Yes']
no_smoker = tips[tips['smoker'] == 'No']

sns.barplot(x=['smoker', 'no_smoker'], y=[smoker['tip'].mean(), no_smoker['tip'].mean()])
# 抽烟和不抽烟的人,对小费的影响不大

31

tips.groupby('sex').mean()['size'].plot(kind='bar')
# 男性买单的情况下,聚餐人数比较多

32

# 如何同时展示多个图像
tips.groupby('smoker').mean().plot(kind='bar')

33

tips.groupby('day').mean().plot(kind='bar')

34

tips.groupby('time').mean().plot(kind='bar')

35

# 男性买单的情况比较多
tips.groupby(['sex'])['size'].count().plot(kind='bar')

36

# total_bill在8~32的情况比较多
tips['total_bill'].plot(kind='hist')

37

# 5元一下的tip比较多,占大多数
tips['tip'].plot(kind='hist')

38

# 小费和账单的相关性
sns.regplot(x='total_bill', y='tip', data=tips)
# total_bill和小费之间有正相关关系
# total_bill越大,小费越多

39

tips[['total_bill', 'tip']].corr()

40

sns.jointplot(x='total_bill', y ='tip', data = tips, kind='reg')

41

sns.pairplot(tips[['total_bill', 'tip', 'size']], kind='reg')
# total_bill、tip、size相互是正相关的
# 探索一下,因果关系
# size->total_bill->tip

42

new_tips = tips.copy()

new_tips['averge_cost'] = new_tips['total_bill']/new_tips['size']

new_tips.groupby('size').mean()['averge_cost'].plot(kind='bar')
# 人均消费,从2个人的消费开始,逐渐下降

43

new_tips['averge_tip'] = new_tips['tip']/new_tips['size']

new_tips.groupby('size').mean()['averge_tip'].plot(kind='bar')
# 人越多,人均小费就越少

44

new_tips.groupby('size').count()['averge_tip'].head(10)

45

tips['all'] = tips['total_bill'] + tips['tip']

tips['all']

46

发布了26 篇原创文章 · 获赞 37 · 访问量 3046

猜你喜欢

转载自blog.csdn.net/qq_16146103/article/details/105110723
今日推荐