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

2020-10-28 15:03:07 浏览数 (1)

一、可视化概述

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

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

  • 纵轴通常代表数量

直方图(histogram)

  • 纵轴通常代表频率

箱纸图(box plot)

  • 用来展示一个连续数值特征地分布。

散点图(scatter plot)

  • 散点图是一种图形表达形式,具有描述两个连续型地特征,具有检测离群值地功能。

气泡图(bubble chart)

  • 展示第三个连续型数值的特征,气泡大小反应特征的大小。

饼图(pie chart)

  • 饼图是条形图的变种,能很好展示各个分量占总体数的比例。
  • 使用饼图时饼图的分类不宜过多。

数据可视化工具: 1、Matplotlib(Python):一个2D绘图库,可以绘制许多高质量的图形 2、Seaborn(Python):Matplotlib基础上的高级绘图库,运用简单的操作就能够画出较为复杂的图形 3、Tableau:一个强大的数据可视化工具,可实时进行可视化数据分析和数据探索 4、Echarts:由百度前端技术部开发的,基于Javascript的数据可视化图表库,提供直观、生动、可交互、可个性化定制的数据可视化图表

二、Matplotlib可视化

1、Matplotlib基本介绍

  • 一个Python的2D绘图库,以各种格式和跨平台交互式环境生成高质量的图形。
  • 仅需几行代码,便可生成条形图、直方图等各种图形。

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、简单的正弦图像
代码语言:javascript复制
## 忽略警告信息
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()			   # 展示图表
2、加上坐标轴名称和刻度
代码语言:javascript复制
%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'$-2pi$', r'$-pi$',  r'$0$', r'$pi$',r'$2pi$'])    # X轴刻度命名

plt.show()
3、在一个图中画多条线
代码语言:javascript复制
%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'$-2pi$', r'$-pi$',  r'$0$', r'$pi$',r'$2pi$'])
plt.show()
4、实线变虚线
  • 通过各种函数和参数控制形状、粗细、颜色;坐标轴范围、缩放、平移等。
代码语言:javascript复制
%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'$-2pi$', r'$-pi$',  r'$0$', r'$pi$',r'$2pi$'])

plt.show()
5、一界多图
  • 在一个输出界面中画多个图,构造不同的排版

代码语言:javascript复制
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'$-2pi$', r'$-pi$',  r'$0$', r'$pi$',r'$2pi$'])


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



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

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


plt.show()

2

代码语言:javascript复制
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'$-2pi$', r'$-pi$', r'$0$', r'$pi$', r'$2pi$'])

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

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'$-2pi$', r'$-pi$', r'$0$', r'$pi$', r'$2pi$'])

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

plt.show()

2.2、其他图像

导入

代码语言:javascript复制
import pandas as pd
tips = pd.read_csv('./input/tips.csv')
tips.head()
1、散点图
代码语言:javascript复制
x = tips['total_bill']
y = tips['tip']
plt.scatter(x,y)
plt.show()
2、柱形图
代码语言:javascript复制
x = tips['size'].value_counts().index.tolist()
y = tips['size'].value_counts().tolist()
plt.bar(x,height = y)
plt.show()
3、箱线图
代码语言:javascript复制
x = tips['tip']
plt.boxplot(x, labels=['tip'])
plt.show()
4、饼图
代码语言:javascript复制
#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()

2.3、拓展包

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

三、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()函数

1.2、颜色设置

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

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

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

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

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

2.1、读取数据

代码语言:javascript复制
import pandas as pd
tips = pd.read_csv('./input/tips.csv')
tips.head()

2.2、作图

1、regplot
  • 使用regplot对两个数值变量的关系进行视图
代码语言:javascript复制
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")
  • 据上图可知,随着总账单的增加,消费也随之增加
2、countplot

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

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

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

代码语言:javascript复制
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))

由上图可知:

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

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

代码语言:javascript复制
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))

由上图可知:

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

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

代码语言:javascript复制
#fig, ax = plt.subplots(figsize=(10,8))
sns.set(style="ticks",font_scale=2)
g = sns.pairplot(tips, hue="sex",height=3)
  • 斜对角线的图展示了三个变量的分布情况
  • 其他图体现了变量间的关系
  • 直观体现男女在变量分布和变量关系的区别

四、Tableau可视化

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

  • 传送门:

Tableau

https://blog.csdn.net/qq_16146103/category_9813151.html

数据可视化

https://blog.csdn.net/qq_16146103/category_9813153.html

五、Seborn绘图案例(源码)

代码语言:javascript复制
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

tips = pd.read_csv('./input/tips.csv')
tips.head()
代码语言:javascript复制
# 男性和女性相比,谁更慷慨
male = tips[tips['sex'] == 'Male']
female = tips[tips['sex'] == 'Female']

sns.barplot(x=['male', 'female'], y=[male['tip'].mean(), female['tip'].mean()])
# 男性更加慷慨一些
# 男性性别上的慷慨
代码语言:javascript复制
# 抽烟的人和不抽烟的人相比,谁更慷慨
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()])
# 抽烟和不抽烟的人,对小费的影响不大
代码语言:javascript复制
tips.groupby('sex').mean()['size'].plot(kind='bar')
# 男性买单的情况下,聚餐人数比较多
代码语言:javascript复制
# 如何同时展示多个图像
tips.groupby('smoker').mean().plot(kind='bar')
代码语言:javascript复制
tips.groupby('day').mean().plot(kind='bar')
代码语言:javascript复制
tips.groupby('time').mean().plot(kind='bar')
代码语言:javascript复制
# 男性买单的情况比较多
tips.groupby(['sex'])['size'].count().plot(kind='bar')
代码语言:javascript复制
# total_bill在8~32的情况比较多
tips['total_bill'].plot(kind='hist')
代码语言:javascript复制
# 5元一下的tip比较多,占大多数
tips['tip'].plot(kind='hist')
代码语言:javascript复制
# 小费和账单的相关性
sns.regplot(x='total_bill', y='tip', data=tips)
# total_bill和小费之间有正相关关系
# total_bill越大,小费越多
代码语言:javascript复制
tips[['total_bill', 'tip']].corr()
代码语言:javascript复制
sns.jointplot(x='total_bill', y ='tip', data = tips, kind='reg')
代码语言:javascript复制
sns.pairplot(tips[['total_bill', 'tip', 'size']], kind='reg')
# total_bill、tip、size相互是正相关的
# 探索一下,因果关系
# size->total_bill->tip
代码语言:javascript复制
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个人的消费开始,逐渐下降
代码语言:javascript复制
new_tips['averge_tip'] = new_tips['tip']/new_tips['size']

new_tips.groupby('size').mean()['averge_tip'].plot(kind='bar')
# 人越多,人均小费就越少
代码语言:javascript复制
new_tips.groupby('size').count()['averge_tip'].head(10)
代码语言:javascript复制
tips['all'] = tips['total_bill']   tips['tip']

tips['all']

0 人点赞