一、可视化概述
- 一图胜千字;一张简单的图标在传递大量信息的同时,能更加直观地阐述观点。可视化历史悠久,最早在墙上、粘土上绘图,随后在纸上。
- 现代其算计出现后,数据可视化发展迅速,展示方式已超过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、实线变虚线
- 通过各种函数和参数控制形状、粗细、颜色;坐标轴范围、缩放、平移等。
%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对两个数值变量的关系进行视图
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']